8

2つの質問があります(そのうちの少なくとも1つはD2010のRTTIと動的インスタンス化に関するものです)

  1. 私はバリー・ケリーによる会議の話の箔のように見えるものを読んでいて、p。13本当に面白そうなもの:TRTTIConstructor.Invoke。隣接する箇条書きでは、「仮想コンストラクターとメタクラスを必要とせずにインスタンスを動的に構築する」ことがわかります。これは素晴らしい機能のようです(そしてまさに私が必要としているものです)!ただし、D2010ドキュメント(ms-help://embarcadero.rs2010/vcl/Rtti.html)を見ると、見つかりません。取り消されましたか?
  2. クラス名が文字列に格納されている場合、クラスのインスタンスを作成する最小限の方法は何ですか?
4

2 に答える 2

10

機能はTRttiMethodに吸収されていると思います。IsConstructor、IsDestructor、およびIsClassMethodプロパティがあるため、通常のメソッドだけでなく「特殊な」タイプのメソッドにも使用できます。

質問2については、次のようにしてみてください。

function GetConstructor(val: TRttiInstanceType): TRttiMethod;
var
   method: TRttiMethod;
begin
   for method in val.GetMethods('Create') do
   begin
      if (method.IsConstructor) and (length(method.GetParameters) = 0) then
         exit(method);
   end;
   raise EInsufficientRTTI.CreateFmt('No simple constructor available for class %s ',
                                     [val.MetaclassType.ClassName]);
end;

これにより、パラメーターを受け取らないという最高のコンストラクターが見つかりCreateます。探しているものがわかっている場合は、他のシグニチャーを持つ他のコンストラクターを探すように変更できます。Invoke次に、結果を呼び出します。

于 2010-03-23T14:19:18.457 に答える
2

.GetMethod()を呼び出してコンストラクターを取得することもできますが、以下を実行して、コンストラクターのパラメーターを使用せずにオブジェクトのインスタンスを作成することもできます。

function CreateInstance(aType : TRttiType) : TObject;
begin
  // Option #1
  result := aType.AsInstance.MetaclassType.Create;
  // Option #2
  result := aType.GetMethod('Create').Invoke(aType.AsInstance.MetaclassType,[]);
end;

基本タイプがわかっている場合は、必要に応じてクラスを型キャストしてパラメーターを渡すことができます。コンポーネントを作成する例を次に示します

result := TComponentClass(aType.AsInstance.MetaClassType).Create(OwnerValue);

于 2010-03-24T04:39:15.513 に答える