2010-04-05 17 views
50

Si tengo una firma de método como¿Cómo obtengo el nombre de tipo de un argumento de tipo genérico?

public string myMethod<T>(...) 

¿Cómo se puede, dentro del método, obtener el nombre del tipo que se da como argumento de tipo? Me gustaría hacer algo similar al typeof(T).FullName, pero eso realmente funciona ...

+5

'typeof (T) .FullName' * debería * funcionar. ¿Qué está pasando en su lugar? –

+0

Recibí errores de compilación en esa declaración, pero aparentemente fueron causados ​​por otra cosa, porque ahora está funcionando. ¡Gracias! –

Respuesta

79

Tu código debería funcionar. typeof(T).FullName es perfectamente válido. Se trata de un completo compilación, el programa de funcionamiento:

using System; 

class Program 
{ 
    public static string MyMethod<T>() 
    { 
     return typeof(T).FullName; 
    } 
    static void Main(string[] args) 
    { 

     Console.WriteLine(MyMethod<int>()); 

     Console.ReadKey(); 
    } 

} 

Ejecución de las impresiones anteriores (como se esperaba):

System.Int32 
+0

Asegúrate de probarlo con MyMethod >() y verás qué obtienes ... debes contabilizar los tipos que aceptan nulos si cuidas el tipo subyacente en ese escenario. – GR7

+1

Quieres decir "' '" Si es así, funciona, pero obtienes 'System.Nullable ' (con sintaxis de nombre completo), que es lo que esperarías ... –

+0

Aunque ya tenía la solución (aunque no funcionó por alguna razón ...), le daré los puntos de reputación por escribir la mejor respuesta con diferencia =) –

1

Asumiendo que tiene un cierto caso de un T disponibles, no es diferente de cualquier otro tipo.

var t = new T(); 

var name = t.GetType().FullName; 
+1

Ni siquiera necesita una instancia de T .... typeof (T) funciona bien sin instancia ... La suya dará un comportamiento diferente si una subclase se pasa al método (como argumento) .. –

+1

El problema con ese código es que si T no tiene un constructor sin parámetros, entonces no funcionará. –

+0

@Nathan: fue solo un ejemplo para mostrar cómo obtener una instancia de T. Es de suponer que con un método genérico tendrá algún tipo de T disponible. @Reed - tienes razón, por supuesto, supuse que eso era lo que él buscaba. – womp

2

typeof (T) .Nombre y typeof (T) .FullName están trabajando para mí ... me sale el tipo pasado como argumento.

+1

ah. Si el tipo que pasó es Nullable, para obtener el tipo subyacente tendría que usar algo como typeof (T) .GetGenericArguments() [0] – GR7

+0

para comprobar si el tipo es anulable, debe usar typeof (T). IsGenericType, y si lo es, usaría lo siguiente para obtener el Nombre o NombreFU (Tipo) typeof (T) .GetGenericArguments() [0]). Nombre – GR7

Cuestiones relacionadas