在约束方法中获取typeof(T)名称

时间:2017-02-05 19:03:16

标签: c#

我想知道如何在约束方法中获取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;

哦,我的......

1 个答案:

答案 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代表Cy代表D。约束中的类型B与那里不相关。