2013-04-10 15 views
8

Napisałem metodę rozszerzenia GenericExtension. Teraz chcę wywołać metodę rozszerzenia Extension. Ale wartość methodInfo jest zawsze pusta.Jak wywołać ogólną metodę rozszerzenia z odbiciem?

public static class MyClass 
{ 
    public static void GenericExtension<T>(this Form a, string b) where T : Form 
    { 
     // code... 
    } 

    public static void Extension(this Form a, string b, Type c) 
    { 
     MethodInfo methodInfo = typeof(Form).GetMethod("GenericExtension", new[] { typeof(string) }); 
     MethodInfo methodInfoGeneric = methodInfo.MakeGenericMethod(new[] { c }); 
     methodInfoGeneric.Invoke(a, new object[] { a, b }); 
    } 

    private static void Main(string[] args) 
    { 
     new Form().Extension("", typeof (int)); 
    } 
} 

Co jest nie tak?

+0

Zobacz http://stackoverflow.com/questions/5959219/how -to-use-reflection-to-get-extension-method-on-generic-type? rq = 1 po więcej informacji na ten temat. – skarmats

Odpowiedz

15

Metoda rozszerzenie nie jest przymocowany do rodzaju Form, jest dołączony do rodzaju MyClass, więc chwycić go tego typu:

MethodInfo methodInfo = typeof(MyClass).GetMethod("GenericExtension", 
    new[] { typeof(Form), typeof(string) }); 
+1

Teraz jestem przygnębiony ... Rozwiązanie jest tak proste i oczywiste. Dziękuję – David

+0

@ David, nie martw się, po prostu się zdezorientowałeś, ponieważ ** wygląda na ** metoda rozszerzenia jest dołączona do typu 'Forma '. Potrzebowałeś tylko drugiego zestawu oczu. –

-2

są przechodzącą w ciąg jako parametru rodzajowego dla metody ..

Ale twoje ograniczenia powiedzieć, że T musi dziedziczyć Form (String, które nie robi).

Zakładam, że chciałeś napisać typeof(MyForm) lub niektóre takie tam.

Powiązane problemy