在我看来,TValue中缺少一个强制性方法; TValue.Equals(TValue).
因此,比较2个TValues的快速和体面的方式,最好不使用TValue.ToString(),它允许变体,记录等之间的错误匹配.
我想使用TValue将字符串转换为枚举类型,我用谷歌搜索但我没有找到如何做到这一点.
type
TEnumTest = (etFirst, etSecond);
var
D: TEnumTest;
begin
D := StrToENumTest('etFirst');
end;
function StrToEnumTest(pStr:String):TEnumTest;
var
V: TValue;
begin
V := TValue.From<String>(pstr);
Result := V.AsType<TEnumTest>;
end;
Run Code Online (Sandbox Code Playgroud)
它不起作用.那肯定是我看不到的蠢事 - 但我没有找到它.我做错了什么?
我知道如何使用GetEnumValue.
编辑:@Warren,它在这里,因为这更容易发布代码:
TEnumUtils = class
class function GetAs<T>(pValor: String): T;
end;
class function TEnumUtils.GetAs<T>(pValor: String): T;
var
Tipo: PTypeInfo;
Temp: Integer;
PTemp: Pointer;
begin
Tipo := TypeInfo(T);
Temp := GetEnumValue(Tipo, pValor);
PTemp := @Temp;
Result := T(PTemp^);
end;
Run Code Online (Sandbox Code Playgroud)
用法:
type
TEnumTest = (etFirst, etSecond);
var
D: TEnumTest;
begin
D := …Run Code Online (Sandbox Code Playgroud) 美好的一天,
TValue是Delphi-2010及更高版本的RTTI功能.
继我之前的问题之后,我曾尝试使用循环函数将TValue作为n维返回.矩阵(2D,3D,4D ...)
例如,此过程将显示n维矩阵(它将列出来自n维矩阵的所有元素作为TValue变量):
Procedure Show(X:TValue);
var i:integer;
begin
if x.IsArray then
begin
for i:=0 to x.GetArrayLength-1 do
show(x.GetArrayElement(i));
writeln;
end else
write(x.ToString,' ');
end;
Run Code Online (Sandbox Code Playgroud)
我不明白如何创建一个函数来从TValue创建一个n维矩阵.例如,我需要一个Function CreateDynArray(Dimensions:整数数组; Kind:TTypeKind):TValue; 并且该函数将返回一个TValue,这是一个动态数组,如何包含dimenssions例如:
返回= CreateDynArray([2,3],tkInteger); 将返回TValue作为tkDynArray,如果我将显示(返回)将列出
0 0 0
0 0 0
Run Code Online (Sandbox Code Playgroud)
没有终止.从TValue我尝试创建一个具有n维度的DynArray
Procedure CreateArray(var Value:TValue; NewDimmension:integer; NewValue2Kind:TTypeKind; NewValue2:TValue; IsLast:Boolean);
var i:integer;
NewValue:TValue;
len:Longint;
begin
If Value.IsArray then// we have components in this dimension
begin
for i:=0 to Value.GetArrayLength-1 do// list all
begin
NewValue:=Value.GetArrayElement[i];
CreateArray(newValue,NewDimension,NewValue2Kind,NewValue2,IsLast);
Value.SetArrayElement(i,NewValue);
end;
end;
end else …Run Code Online (Sandbox Code Playgroud) 如何在 TDateTime 中转换 TValue?
我看到有 AsInteger、AsDouble 等方法,但 TDateTime 没有。
var
c : TRttiContext;
t : TRttiType;
f : TRttiField;
fieldValue : TValue;
fieldDateValue : TDateTime;
begin
c := TRttiContext.Create;
t := c.GetType(Self.ClassType);
for f in t.GetFields do begin
fieldValue := field.GetValue(Self);
//convert the TValue in TDateTime
end;
end;
Run Code Online (Sandbox Code Playgroud)