【问题标题】:Determine if myinstance is Generic<T> [duplicate]确定 myinstance 是否为 Generic<T> [重复]
【发布时间】:2011-07-22 00:02:55
【问题描述】:

给定一个通用类定义BaseClass&lt;T&gt;,是否可以测试这个条件?

if (myvar is BaseClass&lt;&gt;)

我想知道 myvar 是否派生自泛型类,但我不知道(或关心)T 可能是什么。

我认为答案是否定的……我的备用计划是通过myvar.GetType().ToString().Contains("BaseClass&lt;") 或其他方式来解决这个问题。

【问题讨论】:

  • 如果是DerivedClass&lt;T&gt;呢?
  • 这里有很多关于这样做的信息:stackoverflow.com/q/457676/738380
  • @Aaron 感谢您提供的实施链接,看起来不错。

标签: c# generics


【解决方案1】:

像这样:

if (myVar.GetType().IsGenericType
 && myVar.GetType().GetGenericTypeDefinition() == typeof(BaseClass<>))

【讨论】:

  • 如果提问者的真正意思是“源自”而不是“是确切的类型”,那么提问者的建议和这个都不正确。正确的解决方案是在一个循环中使用上述方法,该循环不仅检查当前类型,还检查其所有基本类型。
  • @Corey:正确。在与typeof(BaseClass&lt;&gt;))进行比较之前,您需要在每种基本类型上调用GetGenericTypeDefinition()
  • 酷,不知道你可以typeof(BaseClass&lt;&gt;) 不带T。 @Corey 也是正确的,我确实需要遍历“派生自”的层次结构。谢谢!
【解决方案2】:

我应该认为 SLaks 示例解决了您的具体问题。

我只是想知道这对你有什么好处?在不知道 T 的情况下,您无法将其投射到任何东西或访问任何成员。

另一种解决方案是使用非泛型接口,这样您就可以实际使用 BaseClass 做一些事情。例如:

class BaseClass<T> : IBaseClass {
}

interface IBaseClass {
    public void SomethingUseful();
}

现在您只需要is 运算符:

if (myVar is IBaseClass)
    ((IBaseClass)myVar).SomethingUseful();

【讨论】:

  • 这是一种性能优化,也就是错误代码的正当原因:P 如果/当对象确实 not 从泛型类型派生时,我可以绕过一些工作。一个接口完全可以工作,我认为直接检查类型会“更容易”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2012-12-04
  • 2012-05-18
  • 2019-02-06
相关资源
最近更新 更多