CodeDom中的递归类型约束

本文关键字:类型 约束 递归 CodeDom | 更新日期: 2023-09-27 18:26:36

我们正在使用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<, >
{
}

CodeDom中的递归类型约束

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

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

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