2010-10-18 6 views
26

J'ai une méthode génériqueAppel de la méthode générique avec la variable de type

Foo<T> 

J'ai une variable de type bar

Est-il possible d'obtenir quelque chose comme Foo<bar>

Visual Studio attend un type ou espace de noms à la barre.

Bonté,

Dan

+0

Pouvez-vous montrer du code où vous essayez de l'utiliser? C'est définitivement possible, c'est donc probablement une erreur de syntaxe. – RPM1984

Répondre

34

laisse supposer que Foo est déclaré dans le test de classe tels que

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

} 

Vous devez d'abord instancier la méthode pour le type bar en utilisant MakeGenericMethod Et invoquez-le en utilisant la réflexion.

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

Merci gentiment ... juste ce dont j'avais besoin! –

3

vous pouvez faire ce type par

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

Si je comprends bien votre question, vous avez, en substance, les types suivants définis:

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

public class Bar { } 

Maintenant, vous donné avez une variable bar défini comme tel:

var bar = typeof(Bar); 

Vous souhaitez ensuite pouvoir appeler Foo<T>, en remplaçant T par votre variable d'instance bar.

Voilà comment:

// 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 ... juste un peu plus tard que la réponse acceptée mais merveilleusement mis! –

+3

@ 'Daniel Elliot' - Oui, je sais - 41 secondes plus tard. J'espérais que ma réponse un peu plus détaillée prévaudrait, mais hélas. ;-) – Enigmativity

+0

mon code obtenir du travail, meilleure réponse en détail .... Merci –

Questions connexes