CodeDom中的递归类型约束

时间:2013-08-06 22:23:34

标签: c# generics codedom

我们正在使用CodeDom编写代理生成器,并且似乎没有生成递归约束中的泛型类型。

有问题的代码应该直接传递约束:

    void AddGenericConstraints(CodeTypeDeclaration generatedType, Type type)
    {
        var genericTypes = type.GetGenericArguments();

        foreach (var genericType in genericTypes)
        {
            var codeTypeParameter = new CodeTypeParameter(genericType.Name);
            if (genericType.IsGenericParameter)
            {
                // Get the constraints if the constraint is of user defined type
                var genericParameterConstraints = genericType.GetGenericParameterConstraints();
                foreach (var constraint in genericParameterConstraints)
                {
                    if (!string.Equals(constraint.Name, "ValueType"))
                    {
                        codeTypeParameter.Constraints.Add(constraint);
                    }
                }
            }

            generatedType.TypeParameters.Add(codeTypeParameter);
        }

但是输入:

interface ISomething<T, out TSelf> where TSelf : ISomething<T, TSelf>
{
}

生成输出(不编译):

interface ISomething<T, TSelf> where TSelf : ISomething<, >
{
}

1 个答案:

答案 0 :(得分:1)

由于未知原因,Add方法不使用类型参数名称,然后将其作为Type类型传递,但它将从字符串生成它们。显然差异在于CodeTypeReference类构造函数(这是Constraints集合中的最终项类型)。所以

codeTypeParameter.Constraints.Add(constraint.ToString());

应该给你一个预期的结果。