2009-10-26 11 views
6

Bu küçük sorun var, Jenerik olmayan bir tür üzerinde bir genel yöntem MethodInfo geri almak için hangi argümanlar Type.GetMethod geçmek geçmek anlayamıyorum. Özellikle, bu tip tanımı var: Birkaç denedim Type.GetMethod de geçmesi gerekenGenel olmayan bir .NET türünde bir genel yöntem MethodInfo nasıl edinilir?

public static class A 
{ 
    public static B F<T>(bool dummy) 
    { 
    } 
    public static B F<T>(IEnumerable<T> arg) 
    { 
    ... 
    } 
} 

, ama hiçbiri F yönteminin MethodInfo döndürecektir.

Type.GetMethods veya Type.FindMember'i çağırabileceğimin farkındayım, ancak Type.GetMethod ile ilgileniyorum.

Herhangi bir fikrin var mı?

Teşekkürler.

DÜZENLEME

Aslında, benim kod biraz daha karmaşıktır. Genel yöntem aşırı yüklenmiştir, bu yüzden Type.GetMethod işlevini yalnızca işlev adıyla kullanamıyorum. Bunları varyantları çalıştı:

typeof(A).GetMethod("F", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
typeof(A).GetMethod("F`1", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
typeof(A).GetMethod("F[T]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
typeof(A).GetMethod("F[[T]]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
+0

Lütfen denediğiniz kodu gönderin. –

+0

Sorumu değiştirdim. Teşekkürler. – mark

+0

@Mark Cevabımı değiştirdim. –

cevap

6

sorun GetMethod geçirerek IEnumerable<> parametre uzman olmamasıdır. Gerçekte, T öğesinin, almaya çalıştığınız yöntemle belirtildiği IEnumerable<T> olduğu. Biz yönteme başvuru olmadığı için Ama biz MethodInfo.GetGenericArguments() aracılığıyla T alamayan - biz hala geri almak için çalışıyoruz. yansıma API kısa neresinde

Maalesef, bu. Bir genel yöntemdir yüklenmiş yöntemleri, ayırt edebilmesini sağlar hiçbir Type.GetMethod() aşırı yük yoktur. söyledi ile

Yani, Type.GetMethods() kullanarak ve istediğiniz bir yüklemi sonuçları filtreleme sıkışmış. İlgilendiğiniz yöntemi almak için aşağıdakileri yapabilirsiniz. (Bu tabloyu kapaBu tabloyu aç GetGenericTypeDefinition() aramasının gerekli olduğunu doğrulamadım; onu ihmal edebilirsin. Fikir A<> içine bir tür A<T> dönüştüren, ancak çalışma zamanı zaten bu formda size vermek olabilmesidir.

5

(açıklık sorgulamaya cevap olarak güncellendi): çünkü

GetMethod (örn bir satır.) Kullanılarak yöntemine ele almak için bir yolu yoktur Metodu tanımlayan jenerik veriler, inceleme yöntemine sahip olana kadar mevcut değildir.

MethodInfo[] methods = typeof(A).GetMethods(BindingFlags.Static | BindingFlags.Public); 
MethodInfo genericMethod = methods.Where(m=>m.IsGenericMethod).First(m=>m.ContainsGenericParameters); 
genericMethod = genericMethod.GetGenericMethodDefinition(); 
  1. jenerik parametrelere sahiptir yöntemi bulun yöntemler alın (yalnızca birine sahip varsayarak - Birden fazla eklerseniz, bu biraz daha sağlam olması gerekiyor)
  2. alın jenerik MethodInfo
+1

Teşekkürler, ama soruda yanlış yorumladım. Daha doğru olması için değiştirdim. – mark

+0

Teşekkür ederim, ama sorumu belirtdiğim gibi, GetMethods veya FindMember ile nasıl yapılacağını biliyorum. Özellikle GetMethod ile ilgileniyorum, çünkü işi de yapmalı, ama yapmıyor ve bu beni rahatsız ediyor. – mark

+0

@Mark Bunu yapmanın bir yolu yoktur, çünkü yöntemi tanımlayan genel veriler, inceleme yöntemine sahip olana kadar kullanılamaz. –

İlgili konular