通用类型名称和值

时间:2016-05-20 16:40:08

标签: generics types delphi-xe2

我有一个通用工厂。我想将类型名称及其值作为字符串获取,例如:

值为TTV的枚举Samsung将返回'TTV.Samsung'

值为'stackoverflow'的字符串将返回'string.stackoverflow'

值为10的整数将返回'integer.10'

TValue制作的TTV.Samsung(例如TValue.From(TTV.Samsung))会返回'TTV.Samsung'

这是我的函数声明:

function TGenericFactory<TKey>.GetTypeString(Key: TKey): string;

我如何使这项工作?

1 个答案:

答案 0 :(得分:1)

TValue有一个ToString()方法可以为您处理大部分工作,因此您可以让您的函数从任何输入值创建一个临时TValue,然后使用{{1将值转换为字符串,无论它实际是什么类型。您可以使用RTTI获取输入值的类型名称。在输入值为TValue.ToString()的情况下,您可以使用TValue所持有类型的RTTI。

TValue

结果如下:

uses
  System.Rtti;

type
  TGenericFactory<TKey> = class
  public
    class function GetTypeString(Key: TKey): string;
  end;

function TValueToString(const V: TValue): string; inline;
begin
  Result := String(V.TypeInfo.Name) + '.' + V.ToString;
end;

class function TGenericFactory<TKey>.GetTypeString(Key: TKey): string;
type
  PTValue = ^TValue;
begin
  if TypeInfo(TKey) = TypeInfo(TValue) then
    Result := TValueToString(PTValue(@Key)^)
  else
    Result := TValueToString(TValue.From<TKey>(Key));
end;