如果我可以在C#中测试这样的基本类类型:
bool stringTest = new string() is string;
// and
bool listOfStringTest = new List<string>() is List<string>;
如何测试任何列表或列表 我知道我可以使用反射来弄明白,但是在C#中有一种更简单,更惯用的方法吗?
例如,如果我测试List<int>
或List<string>
,则两者都将返回true。 Nullable<int>
和DateTime
将返回false。注意:仅使用List<>
作为寻找通用目的的示例。
答案 0 :(得分:4)
我认为唯一的方法是使用反射:
Type listType = new List<string>().GetType();
bool isList = listType.IsGenericType && list.GetGenericTypeDefinition() == typeof(List<>);
答案 1 :(得分:1)
要获得完全匹配,您可以使用Type.GetGenericTypeDefinition
method:
bool listOfStringTest = new List<string>().GetType().GetGenericTypeDefinition() == typeof(List<>);
根据Lee的建议,您必须确保相关类型是通用的才能使用此方法。
答案 2 :(得分:0)
我不完全确定你追求的是什么。如果你想知道一个对象是否可用作为特定类型,那么我尽量使用Type.IsAssignableFrom
。如果您正在查看实例是否是未绑定泛型类型的构造泛型类型(例如,构造泛型List<string>
是一种未绑定的泛型List<>
,这似乎是唯一的情况在你的描述中使用is
然后你可以做这样的事情:
var type = obj.GetType();
bool b = type.IsGenericType && typeof (List<>).IsAssignableFrom(type.GetGenericTypeDefinition());
这告诉您,在假设的世界中,您可以声明类型为List<>
的变量,该变量可以赋值为obj
。
不幸的是,您首先需要IsGenericType
检查,因为如果类型不是通用的,某些GetGenericTypeDefintion
实现会抛出异常(如果它们返回null
,则不需要IsGenericType
)。