2012-05-09 12 views
1

いくつかの問題...問題ここ.NETリフレクションと

私は.NETで反射を扱うシナリオを持っている:私はクラスを持っているが、別のクラスのClassA_Baseからメソッドを継承するにClassAを、言います。両方が同じアセンブリにあります。問題のメソッドは、別のアセンブリにあるインターフェイス、IInterfaceAというパラメータをとります。今度は、ClassFをLoadFromメソッドでロードして.dllへのパスを取得すると、メソッドを使用しようとするとMissingMethodExceptionが発生し、Visual Studioでその行を壊して表示すると表示されません基本クラスのメソッド。興味深いことに、基本クラスにはIInterfaceAを返すいくつかのプロパティもあり、これらのプロパティが表示されます。私はその問題が何であるか疑問に思っていますか?

ClassA : ClassA_Base 
{ 
} 

ClassA_Base 
{ 
    SomeMethod(IInterfaceA obj); //Doesn't show up 
    IInterfaceA SomeProperty{ get; } //Shows up 
} 

これはF#を使用して実装されていますが、他の.NET言語実装と同じ動作になると思います。事前に

おかげで...

+0

コードを教えてください。 – svick

答えて

0

代わりのデフォルトType.GetMethodは、BindingFlags値を渡します。このような何か:私はF#1にそれを翻訳する方法がわからない

typeof(ClassA).GetMethod("SomeMethod", 
         BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, 
         null, 
         new Type[] { typeof(IInterfaceA) }, 
         null); 

申し訳ありません。

+0

実際、私がやっていることは、まずインスタンスを作成することです:assembly.CreateInstance(type.FullName、true、BindingFlags.Default、null、constructorparameters、null、null);このシナリオであなたのコードをどのように適応させるのですか? – Tolu

+0

さて、 'Type'オブジェクトが必要です(' typeof'を使用しましたが、おそらく 'Assembly.GetType()'を使用します)。メソッドを取得するには 'GetMethod'を使うことができます。メソッドを呼び出すには' Invoke'メソッドを呼び出してください。 'CreateInstance'から取得したインスタンスを' Invoke'メソッドに渡します。 –

+0

申し訳ありませんが、私は動的な呼び出しの抽象化によって疎遠になりました。私は動的な方法で呼び出していました。ありがとう。私は今これを試してみる。私はF#の動的メソッドの実装を変更し、何が得られるかを見ていきます。 – Tolu

0

リフレクションでは、現在のクラスに実装されているメソッドのみを取得しています。つまり、基本クラスのものは表示されません。メソッドを見つけて、基本クラスで探すだけなら、それを子クラスで呼び出すことができます。

インターフェイスの情報が表示される理由は、まだコンクリートクラスに実装されているからです。 (ベースに実装されているのではなく)

関連する問題