2009-07-11 30 views
23

bir bir arayüzü yöntemin MethodInfo ve arayüzü uygulayan bir sınıf arasında Type sahiptir. Arabirim yöntemini uygulayan sınıf yönteminin MethodInfo numarasını bulmak istiyorum.Yöntem yöntemini, yöntem yöntemini uygulayarak MethodInfo yöntemini nasıl edinebilirim?

Basit method.GetBaseDefinition(), arabirim yöntemleri ile çalışmaz. Arama adı da çalışmayacaktır, çünkü arabirim yöntemini uygularken açıkça herhangi bir adı olabilir (evet, C# değil).

neyin doğru olduğunu, tüm olasılıkları kapsayacak şekilde yapıyor?

cevap

33

Tamam, GetInterfaceMap kullanarak bir yol buldum.

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 - doğru yolundan emin değilsiniz, ancak türünüzdeki tüm arabirimler arasında geçiş yaparak ve sonra yöntem için arabirimleri arayarak bunu yapabilirsiniz. GetBaseDefinition() olmadan sıkışmış olduğunuzdan, arayüzler arasında döngü oluşturmadan doğrudan yapabileceğinizden emin değilsiniz. MethodInfo.Equals eğer çalıştığını kontrol etmek

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; 
     } 
    } 
} 

Sen olurdu: Bunu kullanabilirim bu yöntemi uygulayan bir tek yöntemi (MyMethod) ve benim tipi (Sınıfım) ile benim arabirimi için

İki yöntemin farklı isimleri vardır. Bunun mümkün olduğunu bilmiyordum, muhtemelen ben bir C# 'l

+0

Adla eşleşemezsiniz. İsimlerin eşleşmesi gerekmez. Bu bir C# kuralı, diğer dillerden (VB) istediğin her şeyi geçersiz kılacak yöntemleri söylesin. –

+0

Yukarıdaki örneğim isimle eşleşmiyor, MethodInfo'daki Equals yöntemiyle eşleşiyor. Ben sadece, MethodInfo.Equals'ın yalnızca iki ismin sadece isimlere göre değiştiğini göz önünde bulundurduğunu iki kez kontrol etmeniz gerektiği anlamına geliyordu. –

+0

Doğru, üzgünüm, ama kodun hala ihtiyacım olan şeyi yapmıyor. Bana 'method bilgisi' vermeyecek - bana arayüz vereceğim 'metod bilgisi. Sadece sınıfın arayüzü uyguladığını iddia edersiniz. –

İlgili konular