是否有更正式/更安全的方式来检查System.Reflection.MethodInfo
是否引用了IDisposable.Dispose
的类实现,而不是以下内容?
System.Reflection.MethodInfo methodInfo;
methodInfo = ...; //methodInfo obtaining code here
bool isDisposeMethod = methodInfo.Name == "Dispose";
我已经知道类实现了IDisposable
,因此存在Dispose
,但我正在使用PostSharp方面,该方面应该在调用Dispose
时执行特殊功能(与任何其他方法相比)类方法)。
答案 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
因此,我认为您的班级中有MethodInfo
个Dispose
方法(此处为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")
关于类型,然后根据接口对象获取方法信息。比你应该能够将方法与接口返回的方法进行比较。
仅仅检查姓名是不够的
以下是显示这两个问题的课程:
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();
不确定这是不是你的事。