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

r6vfmomb  于 2023-06-25  发布在  .NET
关注(0)|答案(4)|浏览(129)

我正在使用.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

7gyucuyw

7gyucuyw1#

由于List<T>也实现了非泛型的IList接口,因此您可以简单地检查

if (val is IList)

这并不是说可以假设任何IList都必然是List<T>。但是,在OP的情况下,即有一些索引器返回object,并且需要在特定(也许已知)类型之间有所不同,避免GetType()并依赖is IList是足够好的 * 为此目的 *。
参见MSDN

n53p2ov0

n53p2ov02#

这是一个冗长的比较,但确切的一个:任何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 {
  ...
}
qyuhtwio

qyuhtwio3#

if(val is IList && val.GetType().IsGenericType &&
    val.GetType().GetGenericTypeDefinition() == typeof(List<>))
{

}

请注意,您应该检查val.GetType()是否为Generic,只有瓦尔is IList才会为ArrayList返回true。

编辑:

就像在评论中提到的 Jeppe Stig Nielsen 一样,你也应该在if中添加检查val.GetType().GetGenericTypeDefinition() == typeof(List<>)

w7t8yxp5

w7t8yxp54#

怎么样:

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);
}

相关问题