3

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は「タイプ識別子を期待する」エラーを発生させます。これは公平です。単一のポインター参照をレコードに渡して、そこから型を抽出する方法はありますか?

ありがとう

4

2 に答える 2

4

複数の型をサポートする必要がある場合は、Generic パラメーターを持つクラス内でプロシージャをラップできます。これにより、プロシージャは処理対象のデータ型を認識できます。たとえば、次のようになります。

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);
于 2012-10-15T21:14:43.393 に答える
0

型指定されていない var パラメーターを使用して、コードだけではないのはなぜですか。

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

次のように呼び出すことができます。

MyProc(MyRec,TypeInfo(TMyRec));

したがって、タイプすることは避けてください@MyRec。ただし、強力な型チェックもありません。

Remy によって提案されたジェネリックを使用すると、厳密な型指定が可能になりますが、生成されるコードが少し増えます。

于 2012-10-16T13:40:10.547 に答える