7

System.Reflection.MethodInfoa が次のクラスの実装を参照しているかどうかを確認するためのより正式な/フェイルセーフな方法はIDisposable.Disposeありますか?

System.Reflection.MethodInfo methodInfo;
methodInfo = ...; //methodInfo obtaining code here
bool isDisposeMethod = methodInfo.Name == "Dispose";

クラスが実装されていることは既に知っているIDisposableため、それが存在しますが、 (他のクラスメソッドと比較して) が呼び出されDisposeたときに特別な機能を実行する PostSharp アスペクトを使用しています。Dispose

4

3 に答える 3

6

持つ:

class DisposableObject : IDisposable
{
    public void Dispose()
    {
        //...
    }
}

できるよ:

Type t = typeof(DisposableObject);

InterfaceMapping m = t.GetInterfaceMap(typeof(IDisposable));
MethodInfo mi = t.GetMethod("Dispose");

Console.WriteLine(mi == m.TargetMethods[0]); //true

したがって、クラスにMethodInfofor someDisposeメソッドがあると思います(ここmiでは、単に through GetMethod(string))。次に、 Type.GetInterfaceMap Methodを使用して、宣言型 (ここでは)で実装するためのInterfaceMapping 構造体オブジェクトを取得する必要があります。そこでは、実際にインターフェイスを実装するメソッドを参照しています。したがって、参照がasと等しいかどうかを確認する必要があるのは、1 つのメソッドのみを宣言する場合だけです。IDisposableDisposableObjectTargetMethodsm.TargetMethods[0]IDisposable

MSDN から:

InterfaceMapping 構造体

インターフェイスを実装するクラスの実際のメソッドへのインターフェイスのマッピングを取得します。

型がインターフェイスで指定されたもの以外のメソッド名を使用するインターフェイス メソッドを実装する場合、または型が同じ名前のメソッドを持つ複数のインターフェイスを実装する場合は、InterfaceMapping 構造体を使用します。

InterfaceMapping 構造体を取得するには、Type.GetInterfaceMap メソッドを使用します。


1 つの注意点: クラスが明示的に実装できる場合IDisposablem.TargetMethods[0]、明示的な実装を参照します。したがって、それを取得する方法があるかどうかはわかりません (明示的なインターフェイスを実装するメソッドを見つけるためにリフレクションを使用するをMethodInfo参照InterfaceMappingしてください)。この状況では、エラーが発生しやすくなる可能性があります。特定の問題について確認してください。

于 2012-11-26T00:27:12.493 に答える
4

GetInterface("IDisposable")正しい方法は、型を調べてから、インターフェイス オブジェクトに基づいてメソッド情報を取得することだと思います。手元のメソッドとインターフェイスから返されたメソッドを比較できるはずです。

名前を確認するだけでは十分ではありません

  • 同じ名前で引数が異なる他のメソッドが存在する可能性があります
  • インターフェイスは明示的に実装できます。

両方の問題を示すクラスを次に示します。

class Test : IDisposable
{
   public void Dispose(){}
   public void Dispose(bool flag){}
   void IDisposable.Dispose(){} 
}
于 2012-11-26T00:34:46.477 に答える
3

これはあなたのケースではうまくいくと思いますが、最も美しいコードではありませんが、メソッド情報が IDisposible クラスからのものである場合は返されます。

System.Reflection.MethodInfo methodInfo;
methodInfo = ...; //methodInfo obtaining code here
bool isDisposible = methodInfo.DeclaringType.FindInterfaces(new System.Reflection.TypeFilter((type, filter) => { return type.ToString() == filter.ToString(); }), "System.IDisposable").Any();

これがあなたの後かどうかはわかりません。

于 2012-11-26T00:53:05.013 に答える