2011-09-11 29 views
12

Tôi có một phương thức MehtodBase và tôi cần phải biết liệu phương pháp đó có thực hiện một giao diện cụ thể hay không. Vì vậy, nếu tôi có lớp sau:Làm thế nào để tìm ra phương pháp đang triển khai giao diện cụ thể

class MyClass : IMyInterface 
{ 
    public void SomeMethod(); 
} 

Thực hiện giao diện:

interface IMyInterface 
{ 
    void SomeMethod(); 
} 

Tôi muốn để có thể khám phá trong thời gian chạy (sử dụng phản ánh) nếu một phương pháp nhất định thực hiện IMyInterface.

+1

Bạn có nghĩa là bạn muốn xác định nếu 'MyClass.SomeMethod()' là một thực hiện rõ ràng của 'IMyInterface.SomeMethod()'? –

+0

Không nhất thiết phải rõ ràng nhưng tôi muốn ot biết nếu một đối tượng methodbase tôi nhận là một thực hiện của một phương pháp giao diện cụ thể. –

Trả lời

12

Bạn có thể sử dụng GetInterfaceMap cho việc này.

InterfaceMapping map = typeof(MyClass).GetInterfaceMap(typeof(IMyInterface)); 

foreach (var method in map.TargetMethods) 
{ 
    Console.WriteLine(method.Name + " implements IMyInterface"); 
} 
+1

+1. thực sự tuyệt vời, không bao giờ nghe về điều này. – Tigran

+0

Unfortunly không hoạt động với TypeBuilder. –

-5

nếu bạn không phải sử dụng phản chiếu, thì không. nó không phải là performant như, chẳng hạn, bằng cách sử dụng các toán tử is hoặc as hành

class MyClass : IMyInterface 
{ 
    public void SomeMethod(); 
} 

if (someInstance is IMyInterface) dosomething(); 

var foo = someInstance as IMyInterface; 
if (foo != null) foo.SomeMethod(); 
+0

Tôi muốn biết rằng một phương thức được cung cấp bởi sự phản xạ thực hiện một giao diện - không gọi nó là –

+0

nếu bạn sử dụng và nó trả về true, sau đó bạn biết rằng nó thực hiện giao diện của bạn. –

+0

Một lần nữa - Tôi quan tâm đến truy vấn phương pháp cơ sở để xác định rằng phương pháp là một thực hiện phương pháp trong một giao diện không phải là cá thể. –

6

Bạn có thể sử dụng Type.GetInterfaceMap() cho rằng:

bool Implements(MethodInfo method, Type iface) 
{ 
    return method.ReflectedType.GetInterfaceMap(iface).TargetMethods.Contains(method); 
} 
+0

Điều này là tốt. Lưu ý là InterfaceMapping là một cấu trúc, vì vậy bạn không kiểm tra nó cho null mà là bắt một ArgumentException. – user420667

Các vấn đề liên quan