【问题标题】:Delphi RTTI using Method.Invoke for tkEnumeration ParameterDelphi RTTI 使用 Method.Invoke 获取 tkEnumeration 参数
【发布时间】:2013-08-17 14:18:29
【问题描述】:

如何将 tkEnumeration 作为 RTTI 参数传递给 Method.Invoke。

我试过了

TMyEnums  =  (tsEnum1, tsEnum2);


ParameterList : Array of TValue;

lTypeInfo : PTypeInfo;


lTypeInfo := TypeInfo(TMyEnums);

ParameterList[0] := TValue.FromOrdinal(lTypeInfo, Integer(tsEnum1)); 

Method.Invoke(Object, ParameterList);

失败了。 Method.Invoke 可以采用 tkEnumeration 参数吗? 即使它确实有效 - 在我的应用程序中运行时我不知道参数的类型,所以我无法获得 lTypeInfo;

有没有办法从TRttiParameter获取lTypeInfo?

我可以为 TRttiProperty 获取它,如下所示:

lTypeInfo := RTTIProperties[i].GetValue(SourceObject).TypeInfo

TRttiParameter 是否有等价物?

【问题讨论】:

  • 请提供一个不起作用的完整示例,并添加您在运行时遇到的确切错误/异常。

标签: delphi rtti


【解决方案1】:

需要使用反射来查找参数的类型:

  1. 在方法(TRttiMethod 实例)上调用 GetParameters 以获取参数数组。那是一个 TRttiParameter 数组。
  2. 在 TRttiParameter 实例上,使用 ParamType 获取描述类型的 TRttiType 实例。
  3. 使用 TRttiType 实例的 Handle 属性获取类型信息。
  4. 在调用 TValue.FromOrdinal 时使用该类型信息来创建您的 TValue 实例。
  5. 调用您的方法。
  6. 利润!

我这里没有编译器,所以我不会尝试为此编写代码。希望上面的大纲对你来说已经足够了。

【讨论】:

  • 抱歉 - 我没有收到回复电子邮件通知 - 今天才看到答案。很好的答案。谢谢。
猜你喜欢
  • 2012-07-06
  • 2013-06-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多