我有一个布尔字段,我想用MyField.SetValue(Self, MyValue)
设置它。无论我尝试什么,我都会遇到类型错误。
问题是MyValue总是包含一个序数,并且不被识别为包含布尔值。我知道boolean是一个枚举,它是一个序数,但仍然可以使用TValue设置布尔字段和属性。
我尝试了以下操作来启动MyValue,但每次MyValue.IsOrdinal = True
MyValue.IsBoolean = False
时都会这样做:
MyValue := TValue.From(True);
MyValue := TValue.From<Boolean>(True);
MyBool := True; MyValue := MyValue.From(MyBool);
MyBool := True; MyValue := MyValue.From<Boolean>(MyBool);
MyValue := True;
MyBool := True; MyValue := MyBool;
MyBool := True; TValue.Make(@MyBool, TypeInfo(Boolean), MyValue);
有没有办法让TValue接受它包含一个布尔i.s.o.一个序数,以便MyField.SetValue(Self, MyValue)
成功?
提前致谢,
Decolaman
答案 0 :(得分:3)
TValue可以正常使用布尔值。
检查此示例代码
{$APPTYPE CONSOLE}
uses
Rtti,
SysUtils;
Type
TAnyClass=class
AField : Boolean;
end;
Var
Ctx : TRttiContext;
MyValue : TValue;
A : TAnyClass;
MyField : TRttiField;
begin
try
Ctx:=TRttiContext.Create;
A:=TAnyClass.Create;
try
MyField:=Ctx.GetType(TAnyClass).GetField('AField');
MyValue:= MyValue.From(False);
MyField.SetValue(A, MyValue);
Writeln('The Value of AField Is '+BoolToStr(A.AField, True));
MyValue:= MyValue.From(True);
MyField.SetValue(A, MyValue);
Writeln('The Value of AField Is '+BoolToStr(A.AField, True));
finally
A.Free;
Ctx.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.