检查var是否是任何类型对象的List

时间:2016-11-04 11:18:05

标签: c# .net

我正在使用.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是我制作的自定义类。 ListSystem.Generic.Collections

4 个答案:

答案 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()是否为GenericIList只有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);
}