2013-04-10 25 views
8

Ho scritto il metodo di estensione GenericExtension. Ora voglio chiamare il metodo di estensione Extension. Ma il valore di methodInfo è sempre nullo.Come chiamare un metodo di estensione generico con riflessione?

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

Cosa c'è di sbagliato?

+0

Vedi http://stackoverflow.com/questions/5959219/how -to-use-reflection-to-get-extension-method-on-generic-type? rq = 1 per maggiori informazioni su questo. – skarmats

risposta

15

Il metodo di estensione non è collegata al tipo Form, è attaccato al tipo MyClass, così afferrarlo questa Tipo:

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

Ora sono depresso ... La soluzione è così semplice e ovvia Grazie – David

+0

@David, non preoccuparti, sei appena stato confuso perché ** sembra ** il metodo di estensione è collegato al tipo 'Form'. Avevi solo bisogno di un secondo paio di occhi. –

-2

Si passa nella stringa come parametro generico per il metodo ..

Ma i vostri vincoli dicono che T ha bisogno di ereditare da Form (che String non lo fa).

Suppongo che volessi scrivere typeof(MyForm) o alcuni di questi invece.

Problemi correlati