List <T>的实例之间的关系

Bow*_*opa 5 .net c# generics list

有没有办法通过反思告诉类型A的通用列表与类型B的通用列表相关?例如,我有一个List<string>和一个List<int>.如何通过反思告诉我们这两种类型都是"实例" List<T>.我想我遇到了问题因为List<T>不是真正的类型.typeof(List<T>)举个例子,你做不到. List<T>我猜是一个编译器技巧.那么无论如何要确定两种不同类型是否来自List<T>

Jos*_*osh 8

当然你可以... List<>实际上是所谓的"未绑定泛型类型",这意味着它尚未使用类型进行参数化.当指定type参数时,它被称为"绑定泛型类型".涉及"原始"类型参数的类型,如List<T>"开放泛型类型",以及仅涉及实际类型的类型,如List<int>"封闭泛型类型".在C#中可以使用未绑定泛型类型的唯一情况是typeof运算符.要访问未绑定类型或封闭类型,您可以执行以下操作:

Type listOfT = typeof(List<>); // unbound type
Type listOfString = typeof(List<string>); // closed bound type
Type listOfInt32 = typeof(List<int>); // closed bound type

Assert.IsTrue(listOfString.IsGenericType);

Assert.AreEqual(typeof(string), listOfString.GetGenericTypeParameters()[0]);
Assert.AreEqual(typeof(List<>), listOfString.GetGenericTypeDefinition());

Type setOfString = typeof(HashSet<string>);

Assert.AreNotEqual(typeof(List<>), setOfString.GetGenericTypeDefinition());
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 5

其实List<T> 在许多方面实型(可以使用typeof(List<>),例如),和List<T>不是只是一个编译器的伎俩,但运行时的把戏.但你确实可以检查开放的泛型类型,例如:

    static Type GetRawType(Type type)
    {
        return type.IsGenericType ? type.GetGenericTypeDefinition() : type;
    }
    static void Main()
    {
        List<int> list1 = new List<int>();
        List<string> list2 = new List<string>();
        Type type1 = GetRawType(list1.GetType()),
            type2 = GetRawType(list2.GetType());
        Console.WriteLine(type1 == type2); // true
    }
Run Code Online (Sandbox Code Playgroud)