【问题标题】:Can I simplify this use of RTTI in delphi?我可以在delphi中简化RTTI的这种使用吗?
【发布时间】:2012-10-05 05:26:21
【问题描述】:

我正在 Delphi XE3 中使用 RTTI 做一些工作,到目前为止,这导致调用如下过程:

procedure MyProc( ARecordInstance : pointer; ARecordType : PTypeInfo );

我将这个例程称为如下:

MyProc( @MyRec TypeInfo( TMyRec ));

这一切都很好。

我突然想到我可以将我的程序简化为:

procedure MyProc( var ARecord ); or procedure MyProc( ARecord : pointer );

..如果我可以在我的过程中从 ARecord 获取类型信息。但是,使用诸如“ARecord”之类的“实例”时,TypeInfo 会给出“期望类型标识符”错误,这是公平的。有什么方法可以将单个指针引用传递给我的记录,然后从中提取类型?

谢谢

【问题讨论】:

    标签: delphi delphi-xe2 rtti


    【解决方案1】:

    如果您需要支持多种类型,您可以将您的过程包装在一个具有通用参数的类中,然后该过程将知道它正在使用什么数据类型,例如:

    type
      MyClass<T> = class
      public
        class procedure MyProc(var AInstance : T);
      end;
    
    class procedure MyClass<T>.MyProc(var AInstance : T);
    var
      InstanceType: PTypeInfo;
    begin
      InstanceType := TypeInfo(T);
      //...
    end;
    

    .

    MyClass<TMyRec>.MyProc(MyRec);
    

    【讨论】:

    • +1 这是我也发现的唯一方法。但是MyClass&lt;TMyRec&gt;.MyProc(MyRec)MyProc(MyRec,TypeInfo(TMyRec))... 之间并没有什么大的好处,而且泛型版本会生成更多的代码,并且受Delphi 编译器关于泛型的不稳定性的影响。但是你会得到强类型检查,这可能是值得的。
    • 欢迎使用Delphi的缺点。如果这是一个 C++ 问题,编译器可以自动计算出 T 的值,而无需明确表达它,并且 MyProc 不需要包装在一个类中以编写通用代码:-)
    【解决方案2】:

    为什么不只是代码,使用无类型的 var 参数:

    procedure MyProc(var ARecordInstance; ARecordType : PTypeInfo);
    begin
      ...
    

    您将可以拨打电话:

    MyProc(MyRec,TypeInfo(TMyRec));
    

    所以避免输入@MyRec。但是您也不会进行强类型检查。

    使用 Remy 提出的泛型将允许强类型化,但会生成更多代码。

    【讨论】:

    • 问题的关键是他不想将TypeInfo(TMyRec)指定为显式参数,他希望代码根据传递给ARecordInstance 参数。
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多