C# - 如何知道对象是否是ICollection的衍生物

时间:2011-11-09 19:17:08

标签: c# reflection collections

我有一个通用列表:

IList<T> myobj = new List<T>();

如何检查myobj是否为通用列表(又名。IList<T>)?

我尝试过,但没有成功:

if(myobj.GetType().IsGenericType && myobj is IList) //second exp is never true

此刻我不想知道T的类型,我只是想知道myobj是否是一个列表。

--- EDIT ---------------------

'myobj'一直是null,这导致它失败了所有检查。对不起这是我的错。结果我的问题中描述的解决方案(类似于你的一些答案)工作得很好。我没有尝试过其他答案。

我正在做以下事情:

PropertyType propInf = ...
var myobj = propInf.GetValue(parentobj,null);//was always null

5 个答案:

答案 0 :(得分:4)

您是否尝试过(myObj is IList)

    public static void Main(string[] args)
    {
        List<int> foo = new List<int>();
        bool b = foo is IList;  // true
    }

.NET中的大多数通用集合接口都具有非泛型对应(例如IListIList<T>

http://msdn.microsoft.com/en-us/library/system.collections.ilist.aspx

答案 1 :(得分:2)

typeof(IList<>).IsAssignableFrom(myobj.GetType())

答案 2 :(得分:0)

您可以避免多种类型检查:

var list = myObj as IList;
if (list != null)
{
    //do something with it
}

使用is的类似代码需要两种类型检查,一种用于is运算符,另一种用于强制转换:

if (myObj is IList)
{
    var list = (IList)myObj;
    //do something with it
}

虽然我很困惑为什么你的myobj is IList总是假的。应该是真的。也许你有一个实现IList<T>而不是IList的类。 IList<T>不会继承IList

如果您真的想知道对象是否实现IList<T>,请尝试使用

foreach (var interfaceType in myobj.GetType().GetInterfaces())
    if (interfaceType.IsGenericType)
        if (interfaceType.GetGenericTypeDefinition() == typeof(IList<>))
            return true;

答案 3 :(得分:0)

如果“是”运算符不起作用,则可以使用Type.IsAssignableFrom()

typeof(IList).IsAssignableFrom(obj.GetType());

答案 4 :(得分:0)

 typeof(IList<T>).IsAssignableFrom(myobj.GetType())

 myObj is IList<T>

您的代码失败的原因是您使用的是非通用列表IList,而不是通用的IList。这些是C#中的两种不同类型。

此外,要获得对象实现的所有接口,可以使用反射:

 myObj.GetType().GetInterfaces();