2017-12-10 8 views
0

の実装である私はインターフェイスはMETHODINFOインスタンスをチェックインターフェースの一般的な方法

public interface ITest 
{ 
    Task<bool> MyMethod1<T>(string key, out T value); 
    Task<bool> MyMethod2<T>(string key, out T value); 
} 

そして、彼らは実装

public class TestImpl : ITest 
{ 
    public Task<bool> MyMethod1<T>(string key, out T value) // Implements interface 
    { 
     // Skipped 
    } 

    public Task<bool> MyMethod1<T>(string key, T value) // Does not implements interface 
    { 
     // Skipped 
    } 

    public Task<bool> MyMethod2<T>(string key, out T value) // Implements interface 
    { 
     // Skipped 
    } 

    public Task<bool> MyMethod2<T>(string key, T value) // Does not implements interface 
    { 
     // Skipped 
    } 
} 

を持っている私はMETHODINFOの指定したインスタンスがたITestインターフェイスのメソッドの実装であることを確認する必要があります。例えば

void DoWork(MethodInfo methodInfo) 
{ 
    if (...) // Check methodInfo is implementation of any method declared in ITest interface 
    { 
     /* Do something */ 
    } 
} 

それをどのように行うには?

答えて

1

は、私がアイデアを持っていますが、あなたにそれがあなたの状況
に収まる場合は、実装the classの種類を取得しないのはなぜ私にはわからないと、あなたはその名前nameof(ITest)によって興味のあるインターフェイスを取得し、これは非常に簡単なアイデアです

foreach(var methodInfo in typeof(TestImpl).GetInterface(nameof(ITest)).GetMethods()) 
{ 

} 

、あなたはそれがあるforeachループでインタフェース名をハードコーディングされなかったという事実:次のようにそのタイプによって実装され、このインターフェイスのすべてのメソッドを反復処理もげんきです。 それがあなたの状況に合っていない場合は、あなたの質問に詳細を追加することを検討してください。私は別の考えを考えてこの回答を編集するか、誰かがあなたを助けることができます。その後、
EDIT
それとも、プロパティReflectedTypeによって具象クラスの型を取得することができ、その後、あなたがGetInterfaceMapメソッドを使用して、特定のインターフェイスタイプに基づいて、この種の方法の「反射マッピング」を取得することができ、この方法になるリターンこの具体的なクラスタイプでこのインタフェースタイプ用に実装されているメソッドの場合は、Containsというメソッドを使用して、特定のMethodInfoインスタンスを確認することができます。これが今あなたを助けたと思っています。

static bool IsMethodImplementationOfInterface(Type interfaceType,MethodInfo method) 
{ 
    return method.ReflectedType.GetInterfaceMap(interfaceType).TargetMethods.Contains(method); 
} 

foreach (var methodInfo in typeof(TestImpl).GetMethods()) 
{ 
    if (IsMethodImplementationOfInterface(typeof(ITest), methodInfo)) 
    { 
     //Logic 
    } 
} 
+0

感謝を。私の場合、これは不可能です。チェックが必要なので、サードパーティのライブラリによって渡されたMethodInfo – maxswitcher

+0

より良い例が提供されました – maxswitcher

+0

私の答えが更新されました。 – Mahmoud

0

あなたはGetInterfaceMap使用することができます:返信用

var testImpl = new TestImpl(); 
     var interfaceTargeMethods = testImpl.GetType().GetInterfaceMap(typeof(ITest)).TargetMethods; 

     foreach (var methodInfo in testImpl.GetType().GetMethods()) 
     { 
      if (interfaceTargeMethods.Contains(methodInfo)) 
      { 
       // do something... 
      }  
     } 
関連する問題