首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >测试对象是否为C#中的泛型类型

测试对象是否为C#中的泛型类型
EN

Stack Overflow用户
提问于 2009-06-12 01:27:55
回答 5查看 79.6K关注 0票数 157

如果一个对象是泛型类型,我想执行一个测试。我尝试过以下几种方法,但都没有成功:

代码语言:javascript
复制
public bool Test()
{
    List<int> list = new List<int>();
    return list.GetType() == typeof(List<>);
}

我做错了什么?如何执行此测试?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-11 17:29:28

如果您想检查它是否是泛型类型的实例:

代码语言:javascript
复制
return list.GetType().IsGenericType;

如果您想检查它是否是一个通用List<T>

代码语言:javascript
复制
return list.GetType().GetGenericTypeDefinition() == typeof(List<>);

正如Jon所指出的,这将检查确切的类型等价性。返回false并不一定意味着list is List<T>返回false (即不能将对象赋给List<T>变量)。

票数 233
EN

Stack Overflow用户

发布于 2009-06-11 17:38:07

我假设您不仅想知道类型是否是泛型,而且还想知道对象是否是特定泛型类型的实例,而不需要知道类型参数。

不幸的是,这并不是非常简单。如果泛型类型是一个类(就像本例中一样),这并不是太糟糕,但对于接口来说就更难了。下面是一个类的代码:

代码语言:javascript
复制
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>
    {
    }
}

编辑:如注释中所述,这可能适用于接口:

代码语言:javascript
复制
foreach (var i in type.GetInterfaces())
{
    if (i.IsGenericType && i.GetGenericTypeDefinition() == genericType)
    {
        return true;
    }
}

我暗自怀疑这可能有一些尴尬的边缘案例,但我现在找不到一个失败的案例。

票数 94
EN

Stack Overflow用户

发布于 2015-02-25 09:03:00

你可以使用更短的动态代码,尽管这可能比纯反射慢:

代码语言:javascript
复制
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();
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/982487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档