2017-07-10 10 views
3

私の反射的なC#コードでは、インターフェイスのメソッドを反復処理し、a)インターフェイスを実装すると宣言されたクラスを発行します。b)すべてのメソッドが実装されています。GetMethods()が返されます。.NET .NETでは、インターフェイスのプロパティとイベントをメソッドとして直接実装することは可能ですか?

var methods = typeof(T).GetMethods(); // T is interface 
foreach (var methodInfo in methods) 
{ 
    var parameters = methodInfo.GetParameters().Select(p => p.ParameterType).ToArray(); 
    var method = typeBuilder.DefineMethod(
     methodInfo.Name, 
     MethodAttributes.Public | MethodAttributes.Virtual, 
     methodInfo.ReturnType, 
     parameters); 
     ... // Emit IL 

これは、方法だけでなく、方法(get_メソッドSET_/ADD_ remove_)のペアとしてプロパティおよびイベントだけでなく、作成されます。

動的に作成されるクラスは、インターフェイスの実装としてCLRに受け入れられ、オブジェクトのプロパティとイベントを呼び出す(インターフェイスとしてキャストされます)場合は正常に動作します。しかし、タイプビルダーにはDefinePropertyDefineMethodがあります。 ildasmを使用すると、ただDefineMethodを使用すると、宣言に '.property'がないことが確認できます。インターフェースのプロパティとイベントを「ちょうどの」メソッドのように実装するのはいたずらなのですか?それとも完全に正当なのでしょうか?

+0

新しい型をインスタンス化する場合は、動的な 'bob'変数にそれを代入し、' bob.PropertyNameHere'を使用します。 – mjwills

+0

それは動作しません! :) – Robin

答えて

4

インターフェイスのプロパティとイベントを実装するのはいたずらにしているかのように、 は「単なる」メソッドですか?

はい、そうです。プロパティをプロパティとして使用することはできません(dynamicを使用している場合)。

+0

半分の真実です。プロパティとして使うことができるので、 'dynamic'を使う時には使用しないでください。それほど、私は純粋さのためにリファクタリングしました。 – Robin

+0

明快にするために更新されました - ありがとう@ロビン。 – mjwills

+0

「動的な」この動作は正しいのでしょうか?私は 'dynamic'のメンバーを呼び出すのは、コールサイトにアクセス可能なオブジェクトの実際の最も特殊なタイプのメンバーを呼び出そうとした場合と同じように動作すると考えました。 – IllidanS4

関連する問題