IsConstructedGenericType

IsConstructedGenericType

实例属性 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的值为true。

对于35种类型,IsGenericTypeDefinition为false,而IsConstructedGenericType为true。对于最后一种类型,即(毫不奇怪):
System.Collections.Generic.Dictionary`2[TKey,TValue]
IsGenericTypeDefinition为true,而IsConstructedGenericType为false。

我是否可以得出结论,对于一般类型,IsConstructedGenericType的值始终与IsGenericTypeDefinition相反(取反)?

(文档似乎声称IsConstructedGenericType相反于ContainsGenericParameters,但我们显然对此有很多反例。)

最佳答案

是的,这是正确的。假设所讨论的Type是泛型类型,则IsGenericTypeDefinitionIsConstructedGenericType中的任意一个都是正确的。我们可以很容易地从reference source中获取RuntimeType(这是在执行TypeGetType()时获得的typeof的具体实现),为什么会这样:

public override bool IsConstructedGenericType
{
    get { return IsGenericType && !IsGenericTypeDefinition; }
}

关于c# - 对于泛型类型,IsConstructedGenericType是否始终是IsGenericTypeDefinition的否定?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18796119/

10-10 18:38