C#-如何知道对象是否是ICollection的导数

本文关键字:ICollection 是否是 何知道 对象 C#- | 更新日期: 2023-09-27 18:13:54

我有一个通用列表:

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

如何检查myobj是否为一般列表(又称IList<T>(?

我尝试过,但没有成功:

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

我现在不想知道t的类型,我只想知道myobj是否是一个列表。

---编辑--------------------

"myobj"一直为null,这导致它无法通过所有检查。对不起,我的错。事实证明,我的问题中描述的解决方案(与你的一些答案相似(效果很好。不过我还没有试过其他答案。

我在做以下事情:

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

C#-如何知道对象是否是ICollection的导数

您尝试过(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

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

如果"is"运算符不工作,则可以使用Type.IsAssignableFrom():

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

 myObj is IList<T>

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

此外,为了让所有接口都由您的对象实现,您可以使用反射:

 myObj.GetType().GetInterfaces();

您可以避免像以下这样的多类型检查:

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;