我想知道如何在约束方法中获取typeof(T)名称,这里是代码:
public class SomeItem : ItemBase
{
...
}
我希望在此方法调用中获取类型名称:
Save<SomeItem>(item);
方法将是:
public void Save<T>(T item) where T : ItemBase
{
var type1 = typeof(T).Name;
var type2 = typeof(T).FullName;
var type3 = typeof(T).AssemblyQualifiedName;
// this all will return 'ItemBase' type name
}
我想得到&#34; SomeItem&#34;类型名称。感谢。
我应该这么做:var typeName = item.GetType()。Name;
哦,我的......
答案 0 :(得分:4)
鉴于编译时声明:
T item
表达式:
typeof(T).Name
在推断(或明确给出)T
时给出编译时类型的名称,而:
item?.GetType().Name
给出实际运行时类型的名称(或null
)。
注意:这两种技术都没有从基类约束中提供类型。这可能是一种完全不同的类型。例如:
class B
{
}
class C : B
{
}
class D : C
{
}
以及其他地方的一些方法:
void M<T>(T t) where T : B
{
var x = typeof(T);
var y = t?.GetType();
}
如果我们这样做:
var d = new D();
C c = d;
M(c);
然后在编译时,我们得到M<C>(c);
,因此类型参数T
将替换为C
。但运行时类型为D
(我们有new D()
)。因此,在方法中,x
代表C
,y
代表D
。约束中的类型B
与那里不相关。