将泛型类型变量转换为字符串

Fab*_*zio 2 delphi generics type-conversion delphi-xe7

我正在尝试将类型T为的泛型变量转换为string.

  TMyTest = class
    class function GetAsString<T>(const AValue : T) : string; static;
  end;

...

uses
  System.Rtti;

class function TMyTest.GetAsString<T>(const AValue : T) : string;
begin
  Result := TValue.From<T>(AValue).ToString();
end;
Run Code Online (Sandbox Code Playgroud)

它使用多种类型(如Integer, Double, Boolean...)效果很好,但使用Variant变量“失败” 。

procedure TForm1.FormCreate(Sender: TObject);
var
  Tmp : Variant;
begin
  Tmp := 123;

  ShowMessage(TMyTest.GetAsString<Variant>(Tmp));
end;
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

(变体)

我期待该VarToStr函数获得相同的输出(但我不能将该函数与通用变量一起使用):

123

Dal*_*kar 5

您可以检查是否T是变体,然后VarToStrAsVariant功能上使用。

您可以轻松扩展该功能以适应ToString不会给您预期结果的其他类型。

uses
  System.TypInfo, System.Rtti;

class function TMyTest.GetAsString<T>(const AValue : T) : string;
begin
  if PTypeInfo(TypeInfo(T)).Kind = tkVariant then
    Result := VarToStr(TValue.From<T>(AValue).AsVariant)
  else
    Result := TValue.From<T>(AValue).ToString();
end;
Run Code Online (Sandbox Code Playgroud)