【问题标题】:Get typeof(T) name in constraint method在约束方法中获取 typeof(T) 名称
【发布时间】:2017-06-22 16:47:29
【问题描述】:

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

我想获得“SomeItem”类型名称。谢谢。

解决方案

我应该这样做简单:var typeName = item.GetType().Name;

天哪……

【问题讨论】:

  • 我不确定你到底在问什么?第一个变量type1 包含您所要求的内容,那么您的实际问题是什么?如何从方法中返回字符串?
  • public void Save 方法对 SomeItem 一无所知,如果您使用约束 where T : SomeItem 那么 typeof 将显示您需要的内容。
  • @Igor 'type1' 返回名称 'ItemBase'。我想获得“SomeItem”类型名称。
  • @Riza:您发布的代码返回 type1 的“SomeItem”,而不是“ItemBase”。
  • @MichaelLiu 嗯...我创建了一个用于测试的控制台应用程序,它返回,因为它是 typeof(T) 名称。为什么在我的其他项目中它返回 ItemBase 而不是 SomeItem。

标签: c#


【解决方案1】:

给定编译时声明:

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&lt;C&gt;(c);,所以类型参数TC替换。但是运行时类型是D(我们有new D())。所以在方法内部,x 代表Cy 代表D。约束中的 B 类型在此处不相关。

【讨论】:

  • 你是对的。我完全忘记了从对象中获取类型名称。谢谢大佬。
  • @Riza 我放了更多细节。约束部分是红鲱鱼;这不是因为你得到ItemBase 的约束。而且您的问题具有误导性,因为它说Save&lt;SomeItem&gt;(item);,但这不是您在真实代码中所拥有的。您可能有一个item,其编译时类型(not 调试时按住鼠标)是ItemBase,但其实际运行时类型恰好是SomeItem。请注意,调用泛型方法不是动态的
  • 一点也不,项目类型名称被保存到显示基类而不是某些 T 类型名称的数据库中。这就是问题所在,输出与调试完全相同。现在仍然是这样,但是您从项目 GetType() 本身获取的解决方案实际上是我需要的,我完全忘记了。在我的示例中,我使用 Save(item),实际上只要类型继承 ItemBase 类,您就可以执行 Save(item)。但是,我错过了在 void Save(T @event) where T : ItemBase; 的问题中编写接口代码部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 2011-10-14
  • 1970-01-01
  • 2014-02-27
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多