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

Fab*_*amp 7 c# reflection aop

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

System.Reflection.MethodInfo methodInfo;
methodInfo = ...; //methodInfo obtaining code here
bool isDisposeMethod = methodInfo.Name == "Dispose";
Run Code Online (Sandbox Code Playgroud)

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

hor*_*rgh 6

有:

class DisposableObject : IDisposable
{
    public void Dispose()
    {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以做:

Type t = typeof(DisposableObject);

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

Console.WriteLine(mi == m.TargetMethods[0]); //true
Run Code Online (Sandbox Code Playgroud)

所以,我想你在课堂上有MethodInfo一些Dispose方法(这里mi,简单地通过GetMethod(string)).然后,您需要通过Type.GetInterfaceMap方法在声明类型(此处)中获取InterfaceMapping Structure对象.在那里你引用了真正实现接口的方法.所以,我们只需要检查你的引用是否等于为只声明了一个方法.IDisposableDisposableObjectTargetMethodsm.TargetMethods[0]IDisposable

来自MSDN:

InterfaceMapping结构

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

当类型实现使用除接口指定的方法名称之外的方法名称的接口方法时,或者当类型实现具有相同名称的方法的多个接口时,请使用InterfaceMapping结构.

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


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