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;

尝试将值转换为字符串也不起作用。
prop.SetValue(obj, value.AsString);
prop.SetValue(obj, value.Cast(prop.PropertyType.Handle));

关于如何解决这个问题的任何想法?

更新:

你们中的一些人想知道为什么我要为字符串分配一个整数,我将尝试解释。
(实际上,我更有可能想将一个字符串分配给一个整数,但这并不是那么重要......)

我想要完成的是在 gui 和模型之间做一个一般的“中间人”。我想以某种方式将 textedit 字段 Hook 到一个属性。与其为我拥有的每个模型都设置这样一个中间人,我希望新的 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;

也许魔法的时代还没有到来......我想我可以用几个大案例结构来管理......

最佳答案

TValue 不是变体。您只能读取“您”放入其中的数据类型。

TValue.Cast 不起作用,因为它具有与隐式类型转换相同的语义。您不能将整数分配给字符串,反之亦然。但是您可以将整数分配给浮点数,也可以将整数分配给 int64。

关于Delphi 2010 : New RTTI, 将属性值设置为任意值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1603427/

10-12 15:34