如何获得泛型类型参数的类型名称?


99

如果我有类似的方法签名

public string myMethod<T>( ... )

我如何在方法内部获取作为类型实参给出的类型的名称?我想做类似的事情typeof(T).FullName,但这确实有效...


10
typeof(T).FullName 应该工作。发生了什么事呢?
内森·泰勒

我在该语句上遇到了编译器错误-但显然它们是由其他原因引起的,因为现在它可以正常工作了。谢谢!
Tomas Aschan'4

Answers:


156

您的代码应该可以工作。 typeof(T).FullName是完全有效的。这是一个可以完全正常运行的程序:

using System;

class Program 
{
    public static string MyMethod<T>()
    {
        return typeof(T).FullName;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(MyMethod<int>());

        Console.ReadKey();
    }

}

运行以上打印(按预期方式):

System.Int32

确保使用MyMethod <int >>()对其进行测试,看看会得到什么...如果您关心该场景中的基础类型,则必须考虑可为空的类型。
GR7

1
您的意思是“ <int?>”,如果这样,它可以工作,但是您会得到System.Nullable<int>(使用全名语法),这就是您所期望的...
Reed Copsey 2010年

即使我已经有了解决方案(尽管由于某种原因它无法正常工作...),我也会给您提供代表到目前为止编写最佳答案的代表积分=)
Tomas Aschan 2010年

1
这只是帮助我,因为我认为nameof(T)typeof(T).Name会做同样的事情。原来nameof(T)只是回报T
dahvyd

5

typeof(T).Nametypeof(T).FullName正在为我工作。我得到类型作为参数传递。


1
啊。如果您传递的类型为Nullable,则要使用基础类型,您将必须使用诸如typeof(T).GetGenericArguments()[0]
GR7

检查类型是否可为空,请使用typeof(T).IsGenericType,如果是,则使用以下命令获取名称或FUllName((Type)typeof(T).GetGenericArguments()[0 ])。Name
GR7

1

假设您有一些可用的T实例,那么它与任何其他类型都没有什么不同。

var t = new T();

var name = t.GetType().FullName;

2
你甚至都不需要牛逼.... typeof运算(T)的实例工作正常,没有实例......此致会给出不同的行为,如果一个子类传入方法(作为参数)..
里德•科普塞

1
该代码的问题在于,如果T没有无参数构造函数,则它将无法工作。
内森·泰勒

@Nathan-这只是显示获取T实例的一个示例。大概是在通用方法上,他将提供一些T类型。@里德-你是对的,当然,我认为那是他的追求。
womp'4

另一个问题是T是抽象类或接口-上面的代码不起作用。如果存在通用类型约束(“ where”),则这种类型的代码是安全的,因为我们知道构造函数,并且实际上可能有实例化该类型的原因。除此之外,实例化是浪费的。
安德鲁(Andrew)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.