9

实例属性的文档Type.IsConstructedGenericType不明确或具有误导性。

我尝试了以下代码来查找此属性和相关属性的实际行为:

// create list of types to use later in a Dictionary<,>
var li = new List<Type>();

// two concrete types:
li.Add(typeof(int));
li.Add(typeof(string));

// the two type parameters from Dictionary<,>
li.Add(typeof(Dictionary<,>).GetGenericArguments()[0]);
li.Add(typeof(Dictionary<,>).GetGenericArguments()[1]);

// two unrelated type parameters
li.Add(typeof(Func<,,,>).GetGenericArguments()[1]);
li.Add(typeof(EventHandler<>).GetGenericArguments()[0]);

// run through all possibilities
foreach (var first in li)
{
    foreach (var second in li)
    {
        var t = typeof(Dictionary<,>).MakeGenericType(first, second);
        Console.WriteLine(t);
        Console.WriteLine(t.IsGenericTypeDefinition);
        Console.WriteLine(t.IsConstructedGenericType);
        Console.WriteLine(t.ContainsGenericParameters);
    }
}

该代码通过由 36 种类型组成的笛卡尔积运行t

结果:对于 32 种类型(除 、 、 、 4 种组合之外的所有类型Dictionary<int, int>Dictionary<int, string>Dictionary<string, int>Dictionary<string, string>值为ContainsGenericParameters真。

对于 35 种类型,IsGenericTypeDefinition为假而IsConstructedGenericType为真。对于最后一种类型,即(不出所料):

System.Collections.Generic.Dictionary`2[TKey,TValue]

IsGenericTypeDefinition真的,IsConstructedGenericType也是假的。

我是否可以得出结论,对于泛型类型, 的值IsConstructedGenericType始终是 的相反(否定)IsGenericTypeDefinition

(文档似乎声称这IsConstructedGenericType与 相反ContainsGenericParameters,但我们清楚地展示了很多反例。)

4

1 回答 1

7

是的,这是正确的。假设所Type讨论的是泛型类型,则恰好其中一个IsGenericTypeDefinitionorIsConstructedGenericType为真。我们可以很容易地从参考源中了解RuntimeType(这是您在执行时Type得到的具体实现GetType()typeof)为什么会这样:

public override bool IsConstructedGenericType 
{
    get { return IsGenericType && !IsGenericTypeDefinition; } 
} 
于 2013-09-14T02:27:41.133 回答