我有一个通用列表:
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
答案 0 :(得分:4)
您是否尝试过(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
答案 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();