我正在使用.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。
val
List
List<Code>
Code
System.Generic.Collections
7gyucuyw1#
由于List<T>也实现了非泛型的IList接口,因此您可以简单地检查
List<T>
IList
if (val is IList)
这并不是说可以假设任何IList都必然是List<T>。但是,在OP的情况下,即有一些索引器返回object,并且需要在特定(也许已知)类型之间有所不同,避免GetType()并依赖is IList是足够好的 * 为此目的 *。参见MSDN
object
GetType()
is IList
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 { ... }
qyuhtwio3#
if(val is IList && val.GetType().IsGenericType && val.GetType().GetGenericTypeDefinition() == typeof(List<>)) { }
请注意,您应该检查val.GetType()是否为Generic,只有瓦尔is IList才会为ArrayList返回true。
val.GetType()
Generic
ArrayList
编辑:
就像在评论中提到的 Jeppe Stig Nielsen 一样,你也应该在if中添加检查val.GetType().GetGenericTypeDefinition() == typeof(List<>)。
val.GetType().GetGenericTypeDefinition() == typeof(List<>)
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); }
4条答案
按热度按时间7gyucuyw1#
由于
List<T>
也实现了非泛型的IList
接口,因此您可以简单地检查这并不是说可以假设任何
IList
都必然是List<T>
。但是,在OP的情况下,即有一些索引器返回object
,并且需要在特定(也许已知)类型之间有所不同,避免GetType()
并依赖is IList
是足够好的 * 为此目的 *。参见MSDN
n53p2ov02#
这是一个冗长的比较,但确切的一个:任何
List<T>
都是 * 泛型类型 * 并且具有相同的泛型类型定义与
IList
比较是不够的,一个奇特的反例:qyuhtwio3#
请注意,您应该检查
val.GetType()
是否为Generic
,只有瓦尔isIList
才会为ArrayList
返回true。编辑:
就像在评论中提到的 Jeppe Stig Nielsen 一样,你也应该在if中添加检查
val.GetType().GetGenericTypeDefinition() == typeof(List<>)
。w7t8yxp54#
怎么样: