delphi - 尝试调用 tru RTTI 函数;无效的类型转换

标签 delphi rtti delphi-10.2-tokyo

我正在尝试在运行时从类(对象)调用函数。

找到对象,找到方法,并将参数存储在 TValue 数组中。

调用TRttiMetho.Invoke时,触发以下错误

Invalid Typecast

出了什么问题?

    vcontext: TRTTIContext;
    vtype: TRttiType;
    vitype: TRttiInstanceType;
    vmethod: TRttiMethod;
    vparams: TArray<TRttiParameter>;
    vparam: array of TValue;

    begin
      vcontext := TRttiContext.Create;
      for vtype in vcontext.GetTypes do
      begin
        if (vtype.QualifiedName = 'somemodule.sometype') then // this is found
        begin
          if vtype.IsInstance then
          begin
            vitype := (vtype as TRttiInstanceType);
            for vmethod in vitype.GetMethods do
            begin
             if (vmethod.Name = 'Somefunction') then  // this is found
             begin
               vparams := vmethod.GetParameters;  // actually I know tha there are 2 Parameters
               SetLength(vparam, Length(vparams));
               vparam[0] := TValue.From(Ord(SomeEnum));
               vparam[1] := TValue.From<TSomeObject>(Object);
               vmethod.Invoke(vitype, vparam);    // Invalid Typecast here in
             end;
           end;
         end;
       end;
     end;
     vcontext.Free;
   end;

错误出现在 TRttiInstanceMethodEx.DispatchInvoke 第 5853 行:

    if (cls <> nil) and not cls.InheritsFrom(TRttiInstanceType(Parent).MetaclassType) then
      raise EInvalidCast.CreateRes(@SInvalidCast);

最佳答案

您使用错误的第一个参数调用 Invoke。如果该方法是常规方法,则需要传递调用该​​方法的对象的实例。如果是类方法,则需要传递该方法的TClass

documentation甚至解释了它。

您没有执行任何操作,而是传递 vitype,它是 TRttiInstanceType 类型的实例。

关于delphi - 尝试调用 tru RTTI 函数;无效的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59252845/

相关文章:

Delphi 10.2 - 如何从欢迎页面删除即将举行的事件面板?

delphi - 如何为 FireMonkey 组件添加设计时图标?

Delphi 2007 构建后事件,将 exe 复制到特定目录中?

multithreading - 获取线程起始地址

c++ - 将 RTTI 散列与模板函数一起使用

Delphi OTA 和 RTTI 错误

javascript - 使用文件 ://的 Delphi 和 FireMonkey WebBrowser 回调

delphi - 是否有与 TIniFiles 相同的函数或单元不会保存到文件?

delphi - 解释 GetKeyState/GetCursorPos 的错误

c++ - 将 void* 映射回其原始类型