2009-07-11 39 views
23

Tôi có một MethodInfo của một phương pháp giao diện Type của một lớp mà thực hiện giao diện . Tôi muốn tìm MethodInfo của phương thức lớp thực hiện phương thức giao diện.Làm thế nào để có được MethodInfo của phương thức giao diện, khi thực hiện MethodInfo của phương thức lớp?

Đơn giản method.GetBaseDefinition() không hoạt động với các phương thức giao diện. Tra cứu theo tên sẽ không hoạt động, bởi vì khi thực hiện phương thức giao diện rõ ràng nó có thể có bất kỳ tên nào (có, không phải trong C#).

Vì vậy, cách chính xác cách thực hiện điều đó bao gồm tất cả các khả năng là gì?

Trả lời

33

OK, tôi đã tìm được cách sử dụng GetInterfaceMap.

var map = targetType.GetInterfaceMap(interfaceMethod.DeclaringType); 
var index = Array.IndexOf(map.InterfaceMethods, interfaceMethod); 

if (index == -1) 
{ 
    //this should be literally impossible 
} 

return map.TargetMethods[index]; 
1

Hmmm - không chắc chắn về cách chính xác, nhưng bạn có thể làm điều đó bằng cách lặp qua tất cả các giao diện trên loại của bạn, sau đó tìm kiếm giao diện cho phương thức. Không chắc chắn nếu bạn có thể làm điều đó trực tiếp mà không có looping thông qua các giao diện, như bạn đang kinda bị mắc kẹt mà không GetBaseDefinition().

Đối với giao diện của tôi với một phương pháp duy nhất (MyMethod) và loại của tôi (MyClass) mà thực hiện phương pháp này, tôi có thể sử dụng này:

MethodInfo interfaceMethodInfo = typeof(IMyInterface).GetMethod("MyMethod"); 
MethodInfo classMethodInfo = null; 
Type[] interfaces = typeof(MyClass).GetInterfaces(); 

foreach (Type iface in interfaces) 
{ 
    MethodInfo[] methods = iface.GetMethods(); 

    foreach (MethodInfo method in methods) 
    { 
     if (method.Equals(interfaceMethodInfo)) 
     { 
      classMethodInfo = method; 
      break; 
     } 
    } 
} 

Bạn sẽ phải xem xét rằng việc MethodInfo.Equals hoạt động nếu hai phương thức có tên khác nhau. Tôi thậm chí không biết điều đó là có thể, có lẽ cos tôi là C# 'er

+0

Bạn không thể khớp với tên. Tên không cần phải khớp. Đó là quy tắc C#, các ngôn ngữ khác (VB) cho phép bạn đặt tên cho các phương thức ghi đè bất cứ thứ gì bạn thích. –

+0

Mẫu của tôi ở trên không khớp với tên, nó khớp với phương thức Equals trên MethodInfo. Tôi đã chỉ có nghĩa là bạn sẽ cần phải kiểm tra lại rằng MethodInfo.Equals vẫn xem xét hai trường hợp bằng nhau nếu chúng chỉ thay đổi theo tên. –

+0

Phải, xin lỗi, nhưng mã của bạn vẫn không làm những gì tôi cần. Nó sẽ không cung cấp cho tôi thông tin về phương thức của lớp - nó sẽ cung cấp cho tôi thông tin về phương thức của giao diện. Bạn chỉ khẳng định rằng lớp thực hiện giao diện. –

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