通用类型名称和值
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.
我有一个通用工厂。我想获取类型名称及其值作为字符串,例如:
值为 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.