在C#中测试通用类型的惯用方法

时间:2013-04-05 13:14:55

标签: c# .net syntax types

如果我可以在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<>作为寻找通用目的的示例。

3 个答案:

答案 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 )。