通用类型名称和值

Generic type name and value

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

值为 Samsung 的枚举 TTV 将 return 'TTV.Samsung'.

值为 'Whosebug' 的字符串将 return 'string.Whosebug'.

值为 10 的整数将 return 'integer.10'

TTV.Samsung(例如 TValue.From(TTV.Samsung))制成的 TValue 将 return 'TTV.Samsung'.

这是我的函数声明:

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

我该如何进行这项工作?

TValue 有一个 ToString() 方法可以为你处理大部分工作,所以你可以让你的函数从任何输入值创建一个临时 TValue 然后使用 TValue.ToString() 将值转换为字符串,而不管它实际是什么类型。您可以使用 RTTI 获取输入值的类型名称。如果输入值为 TValue,您可以使用 TValue 持有的类型的 RTTI。

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;

结果如下:

type
  TTV = (Nokia, Samsung, Motorola);

var
  S: String;
begin
  S := TGenericFactory<TTV>.GetTypeString(TTV.Samsung);
  // returns 'TTV.Samsung'

  S := TGenericFactory<String>.GetTypeString('Whosebug');
  // returns 'string.Whosebug'

  S := TGenericFactory<Integer>.GetTypeString(10);
  // returns 'Integer.Whosebug'

  S := TGenericFactory<TValue>.GetTypeString(TValue.From(TTV.Samsung));
  // returns 'TTV.Samsung'
end.