2011-09-11 9 views
12

私はメソッドのMehtodBaseを持っています。そのメソッドが特定のインターフェイスの実装であるかどうかを知る必要があります。インタフェースを実装メソッドが特定のインターフェイスを実装しているかどうかを見つける方法

class MyClass : IMyInterface 
{ 
    public void SomeMethod(); 
} 

::私は次のクラスがある場合 だから

interface IMyInterface 
{ 
    void SomeMethod(); 
} 

を私は特定の方法はIMyInterfaceというを実装している場合(リフレクションを使用して)実行時に発見できるようにしたいです。

+1

意味しますか? –

+0

必ずしも明示的ではありませんが、私が得たメソッドベースオブジェクトが特定のインタフェースメソッドの実装であるかどうかを知りたいと思います。 –

答えて

12

を使用して、たとえば、のようにパフォーマンスではありません。

InterfaceMapping map = typeof(MyClass).GetInterfaceMap(typeof(IMyInterface)); 

foreach (var method in map.TargetMethods) 
{ 
    Console.WriteLine(method.Name + " implements IMyInterface"); 
} 
+1

+1。本当に素晴らしい、決してこれについて聞いたことがない。 – Tigran

+0

TypeBuilderでは不幸にも機能しません。 –

-5

あなたがリフレクションを使用する必要がない場合は、次にしないでください。それはisオペレータまたはasオペレータあなたはこのためにGetInterfaceMapを使用することができます

class MyClass : IMyInterface 
{ 
    public void SomeMethod(); 
} 

if (someInstance is IMyInterface) dosomething(); 

var foo = someInstance as IMyInterface; 
if (foo != null) foo.SomeMethod(); 
+0

私は、リフレクションによって提供されるメソッドがインターフェイスを実装していることを知りたいと思います。つまり、isを使用してtrueを返した場合は –

+0

とは呼ばず、インターフェイスを実装しています。 –

+0

もう一度 - メソッドがインスタンスではなくインターフェイスのメソッドの実装であることを確認するために、methodbaseを照会することに興味があります。 –

6

あなたはそのためのType.GetInterfaceMap()を使用することができます:あなたは、 `MyClass.SomeMethodは()` `IMyInterface.SomeMethod()`の明示的な実装であるかどうかを判断したい

bool Implements(MethodInfo method, Type iface) 
{ 
    return method.ReflectedType.GetInterfaceMap(iface).TargetMethods.Contains(method); 
} 
+0

これは良いことです。 InterfaceMappingは構造体なので、nullをチェックするのではなく、ArgumentExceptionをキャッチすることに注意してください。 – user420667