2013-04-10 18 views
8

Ich schrieb die Erweiterungsmethode GenericExtension. Jetzt möchte ich die Erweiterungsmethode Extension aufrufen. Aber der Wert methodInfo ist immer Null.So rufen Sie eine generische Erweiterungsmethode mit Reflektion auf?

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

Was ist los?

+0

Siehe http://stackoverflow.com/questions/5959219/how to-use-reflection-to-get-extension-method-on-generic-type? rq = 1 für weitere Informationen dazu. – skarmats

Antwort

15

Das Verlängerungsverfahren ist nicht auf die Art befestigt Form, wird es auf die Art MyClass angebracht, so greifen sie diesen Typ off:

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

Jetzt bin ich deprimiert ... Die Lösung ist so einfach und offensichtlich Vielen Dank – David

+0

@David, keine Sorge, Sie haben nur verwirrt, weil es ** fühlt sich an ** die Erweiterungsmethode ist an den Typ 'Form' angehängt. Du brauchst nur ein zweites Augenpaar. –

-2

Sie sind in Zeichenfolge als generischer Parameter für die Methode übergeben ..

Aber Ihre Einschränkungen sagen, dass T von Form erben muss (was String nicht).

Ich nehme an, Sie wollten typeof(MyForm) oder einige solche stattdessen schreiben.

Verwandte Themen