检查方法是否使用反射实现IDisposable.Dispose

时间:2012-11-26 00:22:19

标签: c# reflection aop

是否有更正式/更安全的方式来检查System.Reflection.MethodInfo是否引用了IDisposable.Dispose的类实现,而不是以下内容?

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

我已经知道类实现了IDisposable,因此存在Dispose,但我正在使用PostSharp方面,该方面应该在调用Dispose时执行特殊功能(与任何其他方法相比)类方法)。

3 个答案:

答案 0 :(得分: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

因此,我认为您的班级中有MethodInfoDispose方法(此处为mi,只需通过GetMethod(string))。然后,您需要在声明类型(此处为IDisposable)到InterfaceMapping Structure中为DisposableObject实施获取Type.GetInterfaceMap Method 个对象。你有TargetMethods引用真正实现接口的方法。因此,我们只需要检查您的引用是否等于m.TargetMethods[0],因为IDisposable只声明了一种方法。

来自MSDN:

  

InterfaceMapping结构

     

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

     

当类型实现接口时使用InterfaceMapping结构   使用方法名称以外的方法名称的方法   接口,或者当一个类型实现多个具有a的接口时   具有相同名称的方法。

     

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


一句话:如果您的类可以显式实现IDisposable,那么m.TargetMethods[0]将引用显式实现。所以,除了MethodInfo(参见Use Reflection to find Methods that implement explicit interfaces)之外,我不确定是否有任何方法可以获得它InterfaceMapping。这种情况可能容易出错。检查您的具体问题。

答案 1 :(得分:4)

我认为正确的方法是GetInterface("IDisposable")关于类型,然后根据接口对象获取方法信息。比你应该能够将方法与接口返回的方法进行比较。

仅仅检查姓名是不够的

  • 可能有其他方法具有相同的名称但参数不同
  • 接口可以explcitly实现。

以下是显示这两个问题的课程:

class Test : IDisposable
{
   public void Dispose(){}
   public void Dispose(bool flag){}
   void IDisposable.Dispose(){} 
}

答案 2 :(得分: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();

不确定这是不是你的事。