Is there a more formal/failsafe way to check whether a System.Reflection.MethodInfo
refers to a class' implementation of IDisposable.Dispose
than the following?
System.Reflection.MethodInfo methodInfo;
methodInfo = ...; //methodInfo obtaining code here
bool isDisposeMethod = methodInfo.Name == "Dispose";
I already know the class implements IDisposable
and thus that Dispose
exists, but I'm using a PostSharp aspect that should perform special functionality when Dispose
is called (compared to any other class method).
Having:
class DisposableObject : IDisposable
{
public void Dispose()
{
//...
}
}
You can do:
Type t = typeof(DisposableObject);
InterfaceMapping m = t.GetInterfaceMap(typeof(IDisposable));
MethodInfo mi = t.GetMethod("Dispose");
Console.WriteLine(mi == m.TargetMethods[0]); //true
So, I suppose that you have the MethodInfo
for some Dispose
method in your class (here mi
, simply through GetMethod(string)
). Then you'll need to get an InterfaceMapping Structure object for the IDisposable
implementation in the declaring type (here DisposableObject
) through Type.GetInterfaceMap Method . There you have TargetMethods
referencing the methods really implementing the interface. So, we only need to check whether your reference equals to m.TargetMethods[0]
as IDisposable
declares only one method.
From MSDN:
InterfaceMapping Structure
Retrieves the mapping of an interface into the actual methods on a class that implements that interface.
Use the InterfaceMapping structure when a type implements interface methods that use method names other than those specified by the interface, or when a type implements multiple interfaces which have a method with the same name.
To obtain an InterfaceMapping structure, use the Type.GetInterfaceMap method.
One remark: if your class could implement IDisposable
explicitly, then m.TargetMethods[0]
would reference the explicit implemetation. So, I'm not sure whether there is any way to get it's MethodInfo
except the InterfaceMapping
(See Use Reflection to find Methods that implement explicit interfaces). This situation could be error prone. Check it for your specific issue.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With