我正在使用.NET Framework 4.6.1和C#开发一个应用程序。
我想这样做:
var val = actionArguments[key];
if (val is List<T> as class)
我想检查val
是否是任何类型对象的List
,但该语句不能编译。
如何检查声明为var的变量是否为List?
在我的应用程序上,var是List<Code>
。 Code
是我制作的自定义类。 List
是System.Generic.Collections
。
答案 0 :(得分:5)
由于List<T>
也在实现非通用IList
界面,您只需检查
if (val is IList)
这并不是说人们可以认为IList
的任何内容都必须是List<T>
。但是,在OP的情况下,有一些索引器返回object
并且需要在特定(可能已知)类型之间有所不同,避免GetType()
并依赖is IList
就足够了为此目的 。
请参阅MSDN
答案 1 :(得分:1)
if(val is IList && val.GetType().IsGenericType &&
val.GetType().GetGenericTypeDefinition() == typeof(List<>))
{
}
请注意,您应该检查val.GetType()
是否为Generic
,IList
只有val ArrayList
也会返回true。
修改强>
在评论中提及 Jeppe Stig Nielsen 时,您应该将支票val.GetType().GetGenericTypeDefinition() == typeof(List<>)
添加到if。
答案 2 :(得分:1)
一个冗长的比较,但确切的一个:任何List<T>
是泛型类型并具有相同的泛型类型定义
if (val.GetType().IsGenericType &&
val.GetType().GetGenericTypeDefinition() == typeof(List<>)) {
...
}
与IList
的比较还不够,这是一个奇特的反例:
// generic, does implement IList, does not implement IList<T>
public class CounterExample<T>: IList {
...
}
答案 3 :(得分:0)
怎么样:
var val = actionArguments[key];
var codes = val as List<Code>;
if(codes == null)
{
// val is not of the desired type, so exit, crash, whatever...
return;
}
// work with your list of codes...
foreach(var code in codes)
{
Console.WriteLine(code);
}