我们正在使用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<, >
{
}
答案 0 :(得分:1)
由于未知原因,Add
方法不使用类型参数名称,然后将其作为Type
类型传递,但它将从字符串生成它们。显然差异在于CodeTypeReference
类构造函数(这是Constraints
集合中的最终项类型)。所以
codeTypeParameter.Constraints.Add(constraint.ToString());
应该给你一个预期的结果。