7

是否有比以下更正式/故障安全的方法来检查 a 是否System.Reflection.MethodInfo引用类的实现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,简单地通过GetMethod(string))。然后,您需要通过Type.GetInterfaceMap Method为声明类型(此处)中的实现获取一个InterfaceMapping Structure对象。在那里你引用了真正实现接口的方法。所以,我们只需要检查你的引用是否等于as声明了一个方法。IDisposableDisposableObjectTargetMethodsm.TargetMethods[0]IDisposable

来自 MSDN:

接口映射结构

检索接口到实现该接口的类的实际方法的映射。

当一个类型实现的接口方法使用的方法名称不是由接口指定的方法名称时,或者当一个类型实现具有同名方法的多个接口时,使用 InterfaceMapping 结构。

要获取 InterfaceMapping 结构,请使用 Type.GetInterfaceMap 方法。


一句话:如果您的类可以IDisposable显式实现,那么m.TargetMethods[0]将引用显式实现。所以,我不确定是否有任何方法可以得到它MethodInfoInterfaceMapping参见使用反射查找实现显式接口的方法)。这种情况可能容易出错。检查您的具体问题。

于 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 回答