.NET:如何检查泛型类中的类型?

时间:2008-10-24 11:12:36

标签: c# .net generics types

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

一个例子:

我构建了一个实现 ICollection<的通用类型集合。 T> 。我有像

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

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

如何在方法中询问给定类型 T

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

所以我需要像

这样的东西
if (T is object) {
    // Check for IEnumerable
}

但当然在C#中无效。建议?

非常感谢!

迈克尔

3 个答案:

答案 0 :(得分:29)

您可以使用:typeof(T)

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

答案 1 :(得分:22)

就个人而言,我会通过将IEnumerable<T>方法重命名为AddRange来解决问题。这可以避免此类问题,并与现有的API(例如List<T>.AddRange

)保持一致

当您要添加的T实施IEnumerable<T>时,它还可以保持干净(很少见,我会承认)。

答案 2 :(得分:-1)

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

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