Veg*_*gar 4 delphi rtti delphi-2010
TRTTIProperty.SetValue()接受一个TValue实例,但如果提供的TValue实例基于不同的类型然后属性,事情就会爆炸.
例如
TMyObject = class
published
property StringValue: string read FStringValue write FStringValue;
end;
procedure SetProperty(obj: TMyObject);
var
context: TRTTIContext;
rtti: TRTTIType;
prop: TRTTIProperty;
value: TValue;
begin
context := TRTTIContext.Create;
rtti := context.GetType(TMyObject);
prop := rtti.GetProperty('StringValue');
value := 1000;
prop.SetValue(obj, value);
end;
Run Code Online (Sandbox Code Playgroud)
试图将值转换为字符串也不会工作.
prop.SetValue(obj, value.AsString);
prop.SetValue(obj, value.Cast(prop.PropertyType.Handle));
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
更新:
有些人想知道我为什么要为字符串分配一个整数,我会尝试解释.(实际上,我更希望将字符串分配给整数,但这不是那么相关......)
我想要实现的目标是在gui和模型之间建立一个普通的"中间人".我想以某种方式将textedit字段挂钩到属性.我没有为每个模型制作这样的中间人,而是希望新的RTTI/TValue对我有用.
我也是仿制药的新手,所以我不确定仿制药是如何帮助的.是否可以在运行时使用动态决定的类型实例化泛型,或者编译需要知道吗?
例如
TMyGeneric<T> = class
end;
procedure DoSomething( );
begin
prop := rtti.getProperty('StringValue');
mygen := TMyGeneric<prop.PropertyType>.Create;
//or
mygen := TMyGeneric<someModel.Class>.Create;
end;
Run Code Online (Sandbox Code Playgroud)
也许魔法的时代还未到来......我想我可以管理几个大案例结构......
TValue不是Variant.您只能读取"您"放入其中的数据类型.
TValue.Cast不起作用,因为它具有与隐式类型转换具有相同的语义.您不能将整数分配给字符串,反之亦然.但是您可以为float指定一个整数,或者可以为int64指定一个整数.