2012-03-12 23 views
14

El método genérico es ...C#: Obtener parámetro de tipo en tiempo de ejecución a pasar a un método genérico

public void PrintGeneric2<T>(T test) where T : ITest 
    { 
     Console.WriteLine("Generic : " + test.myvar); 
    } 

Voy a llamar a esto desde Principal() ...

Type t = test2.GetType();  
    PrintGeneric2<t>(test2); 

I obtener el error "CS0246: el tipo o espacio de nombres 't' no se pudo encontrar" y "CS1502: el mejor método sobrecargado partido DoSomethingClass.PrintGeneric2 < t> (T) tiene argumentos no válidos"

esto está relacionado con una pregunta anterior aquí : C# : Passing a Generic Object

He leído que el tipo genérico no se puede determinar en tiempo de ejecución, sin el uso de reflection o methodinfo, pero no estoy muy claro sobre cómo hacerlo en esta instancia.

Gracias si pueden aclararme =)

Respuesta

0

Sólo tiene que llamar:

PrintGeneric2(test2); 

El compilador inferirá <t> de lo que pase.

+1

su sugerencia obligaría al compilador a inferir T como System.Type. No creo que refleje correctamente la intención OP de pasar un tipo de evaluación de tiempo de ejecución –

+0

@AZ, no, no lo haría. Ignore completamente la parte 'Type t = test2.GetType()', no es necesario aquí. 'test2' implementa' ITest' (ver su pregunta anterior). Pasar 'test2' como está, es suficiente aquí. –

+0

Bastante justo. No verifiqué la otra pregunta, así que me faltaba el contexto de test2. Sigo soportando mi suposición de que el OP desea resolver T dinámicamente en tiempo de ejecución de alguna manera y que no es lo que genéricos son para –

6

Los genéricos ofrecen Tiempo de compilación polimorfismo paramétrico. Está intentando usarlos con un tipo especificado solo en Runtime. Respuesta corta: no funcionará y no tiene ninguna razón para hacerlo (excepto con el reflejo, pero esa es una bestia completamente diferente).

26

Si realmente desea invocar un método genérico utilizando un parámetro de tipo no se conoce en tiempo de compilación, puede escribir algo como:

typeof(YourType).GetMethod("PrintGeneric2").MakeGenericMethod(t).Invoke(instance, new object[] { test2 }); 

Sin embargo, como se ha dicho en otras respuestas, los genéricos podría no ser el La mejor solución en tu caso.

+0

Este es un muy buen ejemplo de cómo invocar un método genérico cuando lo que tienes es un tipo de tiempo de ejecución, pero el OP no está tratando de hacer esto en su ejemplo. La respuesta de @Mo-Juice resuelve correctamente la pregunta del OP. Aún así, +1 porque he encontrado esta respuesta varias veces cuando la necesitaba para este escenario de "tipo de tiempo de ejecución como parámetro genérico". ;) – JMD

Cuestiones relacionadas