2013-08-06 44 views
0

我們正在使用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

由於未知的原因,Add方法不使用類型參數名稱,它是通過編輯爲Type類型,但它會從字符串中生成它們。顯然不同的是CodeTypeReference類構造函數(這是Constraints集合中的最終項目類型)。所以

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

應該給你預期的結果。