如何反映作为通用参数提供的类型的名称?我真的想知道在C#和VB.NET中是如何完成的。请参阅以下示例代码和预期响应。
在C#中:
public void Test<T>()
{
Console.WriteLine("The supplied type is {0}",???)
}
在VB.NET中
Public Sub Test(Of T)()
Console.WriteLine("The supplied type is {0}",???)
End Sub
执行Test<String>()
或Test(Of String)()
应生成:
The supplied type is String
答案 0 :(得分:16)
C#(typeof运营商):
public void Test<T>()
{
Console.WriteLine("The supplied type is {0}", typeof(T));
}
VB.NET(GetType运算符):
Public Sub Test(Of T)()
Console.WriteLine("The supplied type is {0}", GetType(T))
End Sub
C#的typeof(T)
和VB.NET的GetType(T)
返回一个System.Type
对象,该对象具有用于检索有关特定Type
的信息的属性和方法。默认情况下,System.Type
的{{1}}方法将返回Type的完全限定名称。要仅返回类型的.ToString()
,请分别在C#或VB.NET中调用Name
或typeof(T).Name
。
答案 1 :(得分:5)
Darin的答案是正确的,但同样值得注意的是,如果您收到T
的实例作为参数,您也可以使用.GetType()
:
public void Test<T>(T target)
{
Console.WriteLine("The supplied type is {0}", target.GetType());
}
只是一种不同的方法(typeof
将检查类型参数,而.GetType()
使用类型的实例。)
正如丹尼尔在评论中指出的那样,需要考虑一些细微差别:typeof(T)
将返回类型参数的类型,而.GetType()
将返回对象的确切类型 - 可能从T
继承,typeof(T).IsAssignableFrom(target.GetType())
可能返回true - 但具体的具体类型可能不同。
一个例子:
using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
GenericClass<TypeX>.GenericMethod(new TypeX());
GenericClass<TypeX>.GenericMethod(new TypeY());
Console.ReadKey();
}
}
public class TypeX {}
public class TypeY : TypeX {}
public static class GenericClass<T>
{
public static void GenericMethod(T target)
{
Console.WriteLine("TypeOf T: " + typeof(T).FullName);
Console.WriteLine("Target Type: " + target.GetType().FullName);
Console.WriteLine("T IsAssignable From Target Type: " + typeof(T).IsAssignableFrom(target.GetType()));
}
}
}
结果输出:
传入 TypeX 的实例作为参数:
TypeOf T:ConsoleApplication2。 TypeX
目标类型:ConsoleApplication2。 TypeX
T IsAssignable来自目标类型:True
传入 TypeY 的实例作为参数:
TypeOf T:ConsoleApplication2。 TypeX
目标类型:ConsoleApplication2。 TypeY
T IsAssignable来自目标类型:True