2010-10-18 31 views
26

tengo un método genéricoLlamando al método genérico con el tipo de variable

Foo<T> 

Tengo un tipo de variable bar

¿Es posible lograr algo así como Foo<bar>

Visual Studio está esperando un tipo o espacio de nombres en el bar

Bondad,

Dan

+0

¿Puedes mostrar algún código donde intentas usarlo? Es definitivamente posible, por lo que es probable que sea un error de sintaxis. – RPM1984

Respuesta

34

Asumamos que Foo se declara en clase Test como

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

} 

Necesitas primera crea una instancia del método para el tipo bar usando MakeGenericMethod. Y luego invocarlo usando reflexión.

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

Gracias amablemente ... ¡justo lo que necesitaba! –

3

se puede hacer este tipo de

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

Si entiendo bien su pregunta, que tiene, en esencia, los siguientes tipos definidos:

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

public class Bar { } 

Ahora, dado que tiene una variable bar define como tal:

var bar = typeof(Bar); 

Desea poder llamar al Foo<T>, reemplazando T con su variable de instancia bar.

Así es como:

// 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 poco más tarde que la respuesta aceptada, ¡pero maravillosamente! –

+3

@ 'Daniel Elliot' - Sí, lo sé - 41 segundos después. Esperaba que prevaleciera mi respuesta un poco más detallada, pero por desgracia. ;-) – Enigmativity

+0

mi código funciona, la mejor respuesta en detalle ... Gracias –

Cuestiones relacionadas