我有一个通用列表:
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
您尝试过(myObj is IList)
:吗
public static void Main(string[] args)
{
List<int> foo = new List<int>();
bool b = foo is IList; // true
}
.NET中的大多数通用集合接口都有非通用的对应接口(例如IList
和IList<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;