1

如果我可以在 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返回错误。注意:仅用List<>作寻找通用用途的示例。

4

3 回答 3

4

我认为这样做的唯一方法是使用反射:

Type listType = new List<string>().GetType();
bool isList = listType.IsGenericType && list.GetGenericTypeDefinition() == typeof(List<>);
于 2013-04-05T13:18:22.367 回答
1

对于完全匹配,您可以使用以下Type.GetGenericTypeDefinition方法

bool listOfStringTest = new List<string>().GetType().GetGenericTypeDefinition() == typeof(List<>);

正如Lee所建议的,您必须确保所讨论的类型是通用的才能使用此方法。

于 2013-04-05T13:17:29.140 回答
0

我不完全确定你在追求什么。如果您想了解一个对象是否可用作特定类型,那么我会尽可能地使用Type.IsAssignableFrom它。如果您要查看实例是否是未绑定泛型类型的构造泛型类型(例如,构造泛型List<string>是未绑定泛型的类型List<>,这似乎是您在描述中无法使用的唯一情况is),那么您可以做这样的事情:

var type = obj.GetType();
bool b = type.IsGenericType && typeof (List<>).IsAssignableFrom(type.GetGenericTypeDefinition());

这告诉你,在一个假设的世界中,你可以声明一个 type 的变量List<>,那个变量可以被赋值为obj

不幸的是,您IsGenericType首先需要检查,因为如果类型不是通用的,某些GetGenericTypeDefintion实现会抛出异常(如果它们返回nullIsGenericType则不需要)。

于 2013-04-05T15:39:32.037 回答