2010-10-18 20 views
26

Ho un metodo genericochiamata metodo generico con la variabile tipo

Foo<T> 

Ho un tipo di variabile bar

E 'possibile realizzare qualcosa di simile Foo<bar>

Visual Studio è in attesa di un tipo o spazio dei nomi al bar.

Gentilezza,

Dan

+0

Puoi mostrare del codice dove stai tentando di usarlo? È assolutamente possibile, quindi è probabile un errore di sintassi. – RPM1984

risposta

34

lascia supporre che Foo viene dichiarata in class Test come

public class Test 
{ 
    public void Foo<T>() { ... } 

} 

È necessario prima istanziare il metodo per il tipo bar utilizzando MakeGenericMethod. E poi invocalo usando la riflessione.

var mi = typeof(Test).GetMethod("Foo"); 
var fooRef = mi.MakeGenericMethod(bar); 
fooRef.Invoke(new Test(), null); 
+0

Grazie gentilmente ... proprio quello di cui avevo bisogno! –

3

si può fare questo tipo da

typeof(Foo<>).MakeGenericType(bar); 
20

Se ho capito bene la tua domanda, si hanno, in sostanza, i seguenti tipi definiti:

public class Qaz 
{ 
    public void Foo<T>(T item) 
    { 
     Console.WriteLine(typeof(T).Name); 
    } 
} 

public class Bar { } 

Ora, data avete una variabile bar definito come tale:

var bar = typeof(Bar); 

Quindi si desidera poter chiamare Foo<T>, sostituendo T con la variabile di istanza bar.

Ecco come:

// Get the generic method `Foo` 
var fooMethod = typeof(Qaz).GetMethod("Foo"); 

// Make the non-generic method via the `MakeGenericMethod` reflection call. 
// Yes - this is confusing Microsoft!! 
var fooOfBarMethod = fooMethod.MakeGenericMethod(new[] { bar }); 

// Invoke the method just like a normal method. 
fooOfBarMethod.Invoke(new Qaz(), new object[] { new Bar() }); 

Enjoy!

+0

+1 ... solo un po 'più tardi della risposta accettata ma meravigliosamente messa! –

+3

@ 'Daniel Elliot' - Sì, lo so - 41 secondi dopo. Speravo che la mia risposta un po 'più dettagliata avrebbe prevalso, ma ahimè. ;-) – Enigmativity

+0

il mio codice ottiene lavoro, la risposta migliore in dettaglio .... Grazie –

Problemi correlati