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

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

我正在使用.NET Framework 4.6.1和C#开发一个应用程序。
我想这样做:

  1. var val = actionArguments[key];
  2. if (val is List<T> as class)

我想检查val是否是任何类型对象的List,但该语句无法编译。
如何检查声明为var的变量是否是List?
在我的应用程序中,var是List<Code>Code是我创建的一个自定义类。ListSystem.Generic.Collections

7gyucuyw

7gyucuyw1#

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

  1. if (val is IList)

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

n53p2ov0

n53p2ov02#

这是一个冗长的比较,但确切的一个:任何List<T>都是 * 泛型类型 * 并且具有相同的泛型类型定义

  1. if (val.GetType().IsGenericType &&
  2. val.GetType().GetGenericTypeDefinition() == typeof(List<>)) {
  3. ...
  4. }

IList比较是不够的,一个奇特的反例:

  1. // generic, does implement IList, does not implement IList<T>
  2. public class CounterExample<T>: IList {
  3. ...
  4. }
qyuhtwio

qyuhtwio3#

  1. if(val is IList && val.GetType().IsGenericType &&
  2. val.GetType().GetGenericTypeDefinition() == typeof(List<>))
  3. {
  4. }

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

编辑:

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

w7t8yxp5

w7t8yxp54#

怎么样:

  1. var val = actionArguments[key];
  2. var codes = val as List<Code>;
  3. if(codes == null)
  4. {
  5. // val is not of the desired type, so exit, crash, whatever...
  6. return;
  7. }
  8. // work with your list of codes...
  9. foreach(var code in codes)
  10. {
  11. Console.WriteLine(code);
  12. }

相关问题