我有一个通用工厂。我想将类型名称及其值作为字符串获取,例如:
值为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;
我如何使这项工作?
答案 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;