Si tengo una firma de método como

public string myMethod<T>( ... )

¿Cómo puedo yo, en el método, obtener el nombre del tipo que fue dada como argumento de tipo? Me gustaría hacer algo similar a typeof(T).FullName, pero que en realidad funciona…

  • typeof(T).FullName debería funcionar. Lo que está sucediendo en su lugar?
  • Tengo errores del compilador en esa declaración – pero al parecer fueron causados por otra cosa, porque ahora se está trabajando. Gracias!
InformationsquelleAutor Tomas Aschan | 2010-04-05

3 Comentarios

  1. 128

    Su código debería funcionar. typeof(T).FullName es perfectamente válido. Esta es una completa compilación, el funcionamiento del programa:

    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 anteriores impresiones (como se esperaba):

    System.Int32
    • Asegúrese de probar con MyMethod<int>>() y ver lo que puedes conseguir…tiene en cuenta para tipos que aceptan valores null si usted se preocupa por el tipo subyacente en ese escenario.
    • Quiere usted decir con «<int?>» Si es así, funciona, pero usted consigue System.Nullable<int> (en nombre completo de la sintaxis), que es lo que usted espera…
    • A pesar de que yo ya tenía la solución (aunque no funciona por alguna razón…), te voy a dar la rep puntos por escribir la mejor respuesta por ahora =)
    • Gracias 😉 a Veces ayuda el hecho de saber que NO es el problema…
  2. 5

    typeof(T).Name y typeof(T).FullName están trabajando para mí. Me sale el tipo que se pasa como argumento.

    • ah. Si el tipo que pasa es que aceptan valores null, para obtener el tipo subyacente usted tendría que usar algo como typeof (T).GetGenericArguments()[0]
    • para comprobar si el tipo que acepta valores null, tendría que utilizar typeof(T).IsGenericType, y si es así, tendría que utilizar la siguiente para obtener el Nombre o FUllName ((Tipo)typeof(T).GetGenericArguments()[0]).Nombre
  3. 1

    Asumiendo que usted tiene alguna instancia de un T disponible, no es diferente de cualquier otro tipo.

    var t = new T();
    
    var name = t.GetType().FullName;
    • Usted incluso no necesita una instancia de T…. typeof(T) funciona bien con ninguna instancia… el Tuyo dan un comportamiento diferente si una subclase se pasa al método (como argumento)..
    • El problema con este código es que si T no tiene un constructor sin parámetros, entonces no va a funcionar.
    • era sólo un ejemplo para mostrar obtener una instancia de T. Presumiblemente en un método genérico que va a tener algún tipo T disponible. @Reed – usted está en lo correcto, por supuesto, yo supuse que era lo que él buscaba.
    • Otra cuestión sería en el caso de que T es una clase abstracta o una interfaz – el código anterior no funcionaría. En el caso de que hay un genérico tipo de restricción (el «dónde»), este tipo de código puede ser seguro, ya que sabemos que el constructor y en realidad puede haber razones para crear una instancia del tipo. Aparte de que la creación de instancias es un desperdicio.

Dejar respuesta

Please enter your comment!
Please enter your name here