【问题标题】:Generics and Array of const常量的泛型和数组
【发布时间】:2014-10-29 08:14:20
【问题描述】:
type
  TGeneric<T> = class(TBase)
  public
    procedure Swap(Harry : T);
    procedure NotifyAll(AParams : T); 
  end;

我有两个问题

  1. 有什么方法可以将泛型变量类型转换为任何其他类型,例如变体等。

  2. 如何在函数中传递泛型类型,像这里一样接受 const 数组

    Delphi - How can I pass Generic parameter to function that accept Array of const parameter

【问题讨论】:

  • 嗨约翰,理想情况下你会问两个问题
  • 这两个问题都是相关的,所以我在这里没有单独问他们。
  • 您已经将答案链接到问题 2 还是我在这里遗漏了什么?
  • 什么是泛型变量?你能给我们一些示例代码吗?
  • TGeneric = class (tbase) public procedure Swap(harry : T);程序 NotifyAll( AParams : T);结尾;这里 harry 是可以接受任何类型的泛型变量

标签: delphi generics delphi-xe4


【解决方案1】:

有什么方法可以将泛型变量类型转换为任何其他类型,例如 Variant 等。

正如我对您链接的问题的回答中所述,适用于泛型的变体类型是TValue。您可以使用From 方法从泛型类型创建TValue 实例:

procedure TMyClass.Foo<T>(const Item: T);
var
  Value: TValue;
begin
  Value := TValue.From<T>(Item);
end;

如何在接受array of const 的函数中传递泛型类型?

这与question you linked to 中提出的问题完全相同。答案与那里所说的相同,即您不能将通用参数作为variant open array parameter 传递。再次,TValue 进行救援。不要使用变体开放数组参数,而是使用TValue 的开放数组。


这里的底线是与泛型一起工作的变体类型,并且随 Delphi RTL 提供,是 TValue

【讨论】:

  • 如果我使用 tvalue,它会破坏我代码的许多其他部分,这就是我避免使用它的原因
  • 您将不得不接受不能将泛型参数作为变体开放数组参数传递。
  • 我可以将它转换成其他类型然后发送它,但不是 Tvalue
  • 你一直在问,但我的答案是一样的。使用TValue
【解决方案2】:

从链接的问题中复制我的代码:

procedure TEventMulticaster<T>.Notify(AUser: T);
var
  ParametersAsTValueArray: array[1 .. 1] of TValue;
begin
  ParametersAsTValueArray[1] := TValue.From<T>(AUser);
  NotifyAll(TValueArrayToArrayOfConst(ParametersAsTValueArray));
end;

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多