Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-如何知道对象是否是ICollection的导数_C#_Reflection_Collections - Fatal编程技术网

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

C#-如何知道对象是否是ICollection的导数,c#,reflection,collections,C#,Reflection,Collections,我有一个通用列表: IList<T> myobj = new List<T>(); 我现在不想知道t的类型,我只想知道myobj是否是一个列表 ---编辑--------------------- “myobj”一直为null,这导致它无法通过所有检查。对不起,我的错。事实证明,我的问题(与你的一些答案类似)中描述的解决方案效果很好。不过,我还没有试过其他答案 我在做以下工作: PropertyType propInf = ... var myobj = propInf

我有一个通用列表:

IList<T> myobj = new List<T>();
我现在不想知道t的类型,我只想知道
myobj
是否是一个列表

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


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

我在做以下工作:

PropertyType propInf = ...
var myobj = propInf.GetValue(parentobj,null);//was always null
您是否尝试过
(myObj是IList)

publicstaticvoidmain(字符串[]args)
{
List foo=新列表();
bool b=foo是IList;//true
}
NET中的大多数通用集合接口都有非通用的对应接口(例如
IList
IList

您是否尝试过
(myObj是IList)

publicstaticvoidmain(字符串[]args)
{
List foo=新列表();
bool b=foo是IList;//true
}
NET中的大多数通用集合接口都有非通用的对应接口(例如
IList
IList


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

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是IList
总是错误的。这应该是真的。也许您有一个类实现了
IList
,但没有实现
IList
<代码>IList不继承自
IList

如果您确实想知道对象是否实现了
IList
,请尝试以下操作

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

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

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是IList
总是错误的。这应该是真的。也许您有一个类实现了
IList
,但没有实现
IList
<代码>IList不继承自
IList

如果您确实想知道对象是否实现了
IList
,请尝试以下操作

foreach (var interfaceType in myobj.GetType().GetInterfaces())
    if (interfaceType.IsGenericType)
        if (interfaceType.GetGenericTypeDefinition() == typeof(IList<>))
            return true;
foreach(myobj.GetType().GetInterfaces()中的var interfaceType)
if(interfaceType.IsGenericType)
if(interfaceType.GetGenericTypeDefinition()==typeof(IList))
返回true;
如果“is”操作员不工作,您可以使用:

如果“is”运算符不工作,则可以使用:

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

IList
是与
IList
分开定义的非通用接口。
myObj
value
是否为同一参考<代码>列表确实继承了
IList
,因此第二个表达式对于
myObj
的计算结果应为true。“myObj”的副本一直为null,这导致它无法通过所有检查。对不起,我的错。事实证明,我的问题(与你的一些答案类似)中描述的解决方案效果很好。不过,我还没有尝试过其他答案。@psycholidad,这个问题与您链接的问题不太一样。OP要检查的类型是接口类型而不是类类型,因此解决方案略有不同。
IList
是一个与
IList
分开定义的非泛型接口。
myObj
value
是否打算作为相同的参考<代码>列表确实继承了
IList
,因此第二个表达式对于
myObj
的计算结果应为true。“myObj”的副本一直为null,这导致它无法通过所有检查。对不起,我的错。事实证明,我的问题(与你的一些答案类似)中描述的解决方案效果很好。不过,我还没有尝试过其他答案。@psycholidad,这个问题与您链接的问题不太一样。OP想要检查的类型是接口类型,而不是类类型,因此解决方案略有不同。我不确定为什么这个答案会得到支持:OP确实尝试了
(myobj是IList)
,但当他期望为true时得到了false;这就是他发布这个问题的原因。我认为OP编辑了这个问题(并且显然接受了这个答案)。嗯,我查看了编辑历史,原始版本包括“myObj is IList”检查。当然,正如海报在一次编辑中指出的那样,它失败的原因是myObj为null。我不确定为什么这个答案会获得选票:OP确实尝试了
(myObj为IList)
,但当他预期为真时,结果为假;这就是他发布这个问题的原因。我认为OP编辑了这个问题(并且显然接受了这个答案)。嗯,我查看了编辑历史,原始版本包括“myObj is IList”检查。当然,正如海报在编辑中指出的,它失败的原因是myObj为null。
 typeof(IList<T>).IsAssignableFrom(myobj.GetType())
 myObj is IList<T>
 myObj.GetType().GetInterfaces();
typeof(IList<>).IsAssignableFrom(myobj.GetType())