如果一个对象是泛型类型,我想执行一个测试。我尝试过以下几种方法,但都没有成功:
public bool Test()
{
List<int> list = new List<int>();
return list.GetType() == typeof(List<>);
}
我做错了什么?如何执行此测试?
发布于 2009-06-11 17:29:28
如果您想检查它是否是泛型类型的实例:
return list.GetType().IsGenericType;
如果您想检查它是否是一个通用List<T>
return list.GetType().GetGenericTypeDefinition() == typeof(List<>);
正如Jon所指出的,这将检查确切的类型等价性。返回false
并不一定意味着list is List<T>
返回false
(即不能将对象赋给List<T>
变量)。
发布于 2009-06-11 17:38:07
我假设您不仅想知道类型是否是泛型,而且还想知道对象是否是特定泛型类型的实例,而不需要知道类型参数。
不幸的是,这并不是非常简单。如果泛型类型是一个类(就像本例中一样),这并不是太糟糕,但对于接口来说就更难了。下面是一个类的代码:
using System;
using System.Collections.Generic;
using System.Reflection;
class Test
{
static bool IsInstanceOfGenericType(Type genericType, object instance)
{
Type type = instance.GetType();
while (type != null)
{
if (type.IsGenericType &&
type.GetGenericTypeDefinition() == genericType)
{
return true;
}
type = type.BaseType;
}
return false;
}
static void Main(string[] args)
{
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new List<string>()));
// False
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new string[0]));
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new SubList()));
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new SubList<int>()));
}
class SubList : List<string>
{
}
class SubList<T> : List<T>
{
}
}
编辑:如注释中所述,这可能适用于接口:
foreach (var i in type.GetInterfaces())
{
if (i.IsGenericType && i.GetGenericTypeDefinition() == genericType)
{
return true;
}
}
我暗自怀疑这可能有一些尴尬的边缘案例,但我现在找不到一个失败的案例。
发布于 2015-02-25 09:03:00
你可以使用更短的动态代码,尽管这可能比纯反射慢:
public static class Extension
{
public static bool IsGenericList(this object o)
{
return IsGeneric((dynamic)o);
}
public static bool IsGeneric<T>(List<T> o)
{
return true;
}
public static bool IsGeneric( object o)
{
return false;
}
}
var l = new List<int>();
l.IsGenericList().Should().BeTrue();
var o = new object();
o.IsGenericList().Should().BeFalse();
https://stackoverflow.com/questions/982487
复制相似问题