【问题标题】:.NET: How to check the type within a generic typed class?.NET:如何检查泛型类型类中的类型?
【发布时间】:2010-09-18 23:41:24
【问题描述】:

如何在类中获取泛型类型类的类型?

一个例子:

我构建了一个实现 ICollection 的通用类型化集合。在我里面有像

这样的方法
    public void Add(T item){
        ...
    }

    public void Add(IEnumerable<T> enumItems){
        ...
    }

我怎样才能在给定类型T的方法内询问?

我的问题的原因是:如果 object 用作 T 集合使用 Add(object item) 而不是 Add(IEnumerable enumItems) 即使该参数是 IEnumerable。所以在第一种情况下,它将整个可枚举集合添加为一个对象,而不是可枚举集合的多个对象。

所以我需要类似的东西

if (T is object) {
    // Check for IEnumerable
}

但这当然不能在 C# 中工作。有什么建议吗?

非常感谢!

迈克尔

【问题讨论】:

    标签: c# .net generics types


    【解决方案1】:

    您可以使用:typeof(T)

    if (typeof(T) == typeof(object) ) {
        // Check for IEnumerable
    }
    

    【讨论】:

    • 这回答了标题中提出的问题。
    【解决方案2】:

    就个人而言,我会通过将IEnumerable&lt;T&gt; 方法重命名为AddRange 来绕过这个问题。这避免了此类问题,并且与现有的 API 一致,例如 List&lt;T&gt;.AddRange

    当您要添加的 T 实现 IEnumerable&lt;T&gt; 时,它还可以保持干净(我承认,很少见)。

    【讨论】:

      【解决方案3】:

      如果您想在泛型类/方法中使用 is 运算符,您必须将 T 限制为引用类型:

      public void MyMethod<T>(T theItem) where T : class
      {
          if (theItem is IEnumerable) { DoStuff(); }
      }
      

      【讨论】:

      • 我认为他只是担心当 T 是 System.Object 时将非泛型 IEnumerable 作为 System.Object 传递
      猜你喜欢
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      相关资源
      最近更新 更多