Có:
class DisposableObject : IDisposable
{
public void Dispose()
{
//...
}
}
Bạn có thể làm:
Type t = typeof(DisposableObject);
InterfaceMapping m = t.GetInterfaceMap(typeof(IDisposable));
MethodInfo mi = t.GetMethod("Dispose");
Console.WriteLine(mi == m.TargetMethods[0]); //true
Vì vậy, tôi giả sử rằng bạn có MethodInfo
đối với một số Dispose
phương pháp trong lớp học của bạn (ở đây mi
, chỉ cần thông qua GetMethod(string)
). Sau đó, bạn sẽ cần phải có đối tượng InterfaceMapping Structure để triển khai IDisposable
trong loại khai báo (tại đây DisposableObject
) thông qua Type.GetInterfaceMap Method. Ở đó bạn có TargetMethods
tham chiếu đến các phương thức thực sự triển khai thực hiện giao diện. Vì vậy, chúng tôi chỉ cần kiểm tra xem tham chiếu của bạn có bằng m.TargetMethods[0]
là IDisposable
tuyên bố chỉ một phương pháp hay không.
Từ MSDN:
InterfaceMapping Cấu trúc
Lấy ánh xạ của một giao diện vào phương pháp thực tế trên một lớp mà thực hiện giao diện đó.
Sử dụng cấu trúc InterfaceMapping khi một loại thực hiện giao diện phương pháp sử dụng tên phương pháp khác so với những quy định của giao diện , hoặc khi một loại thực hiện nhiều giao diện trong đó có một phương pháp có cùng tên.
Để có cấu trúc InterfaceMapping, hãy sử dụng phương thức Type.GetInterfaceMap .
Một nhận xét: nếu lớp học của bạn có thể thực hiện IDisposable
rõ ràng thì m.TargetMethods[0]
sẽ tham khảo các implemetation rõ ràng. Vì vậy, tôi không chắc chắn có cách nào để có được nó là MethodInfo
ngoại trừ InterfaceMapping
(Xem Use Reflection to find Methods that implement explicit interfaces). Tình trạng này có thể dễ bị lỗi. Kiểm tra nó cho vấn đề cụ thể của bạn.
Nếu một lớp thực hiện 'IDisposable', bạn được đảm bảo rằng nó triển khai' Vứt bỏ' - đó là điểm của giao diện. – Blorgbeard
Tôi hiểu điều đó. Tôi biết rằng 'Dispose' tồn tại, nhưng tôi đang sử dụng một khía cạnh PostSharp nên thực hiện chức năng đặc biệt khi' Dispose' được gọi so với một hàm khác. Mặt sau PostSharp trả về chữ ký phương thức trong 'System.Reflection.MethodInfo'. –