Types Roslyn:如何创建泛型方法类型约束

Types Roslyn:如何创建泛型方法类型约束,types,constraints,roslyn,Types,Constraints,Roslyn,我有一些这样的代码(使用LinqPad): 使用静态Microsoft.CodeAnalysis.CSharp.SyntaxFactory; void Main() { var cd=类声明($“TestExtensions”) .AddModifiers(令牌(SyntaxKind.PublicKeyword)、令牌(SyntaxKind.StaticKeyword)); var方法= 方法声明(ParseTypeName($“T”),$“SetTest”) .AddModifiers(标记(

我有一些这样的代码(使用LinqPad):

使用静态Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
void Main()
{
var cd=类声明($“TestExtensions”)
.AddModifiers(令牌(SyntaxKind.PublicKeyword)、令牌(SyntaxKind.StaticKeyword));
var方法=
方法声明(ParseTypeName($“T”),$“SetTest”)
.AddModifiers(标记(SyntaxKind.PublicKeyword),标记(SyntaxKind.StaticKeyword))
.AddTypeParameterListParameters(类型参数(标识符(“T”))
.AddParameterListParameters(
参数(标识符(“定义”)).WithType(ParseTypeName(“T”)).AddModifiers(令牌(SyntaxKind.ThisKeyword)),
参数(标识符(“值”))。WithType(ParseTypeName(“int”))
)
.AddConstraintClauses(类型参数ConstraintClause(“T”).WithConstraints(GetSL()))
.WithBody(块(ParseStatement($“definition.SetField(\“test\”,value);)),ParseStatement(“return definition;”);
cd=cd.AddMembers(方法);
//名称空间
var ns=合成工厂
.NamespaceDeclaration(ParseName(“MyNS”))
.ADD成员(cd);
var cu=SyntaxFactory.CompilationUnit();
变量代码=cu.AddMembers(ns)
.normalize空白()
.ToFullString();
//黑客,因为我做不到。有约束就行
//code=code.Replace(“其中T:,$”其中T:{T.Name}”);
code.Dump();
}
SeparatedSyntaxList GetSL()
{
var list=SeparatedList();
添加(TypeConstraint(ParseTypeName($“Test”));
退货清单;
}
除了类型约束之外,它生成我想要的 e、 g

名称空间MyNS
{
公共静态类TestExtensions
{
公共静态T SetTest(此T定义,int值)
其中T:
{
定义。设置字段(“测试”,值);
返回定义;
}
}
}
GetSL().ToFullString()生成一个空结果

我需要类型约束为:
其中T:Test


到目前为止,我找不到WithConstraints()的任何示例。

您几乎得到了正确的结果。您的
GetSL
方法中的主要问题。因为
SeparatedSyntaxList
是不可变的,所以必须使用
Add
方法的返回值

该变体适用于:

var parameterConstraintClauseSyntax = SyntaxFactory.TypeParameterConstraintClause(
  SyntaxFactory.IdentifierName("T"),
  new SeparatedSyntaxList<TypeParameterConstraintSyntax>()
   .Add(SyntaxFactory.TypeConstraint(SyntaxFactory.ParseTypeName("Test"))));

methodSyntax = methodSyntax.AddConstraintClauses(parameterConstraintClauseSyntax);
var参数constraintclausesyntax=SyntaxFactory.TypeParameterConstraintClause(
SyntaxFactory.IdentifierName(“T”),
新的SeparatedSyntaxList()
.Add(SyntaxFactory.TypeConstraint(SyntaxFactory.ParseTypeName(“Test”)));
methodSyntax=methodSyntax.AddConstraintClauses(参数ConstraintClauseSyntax);

谢谢。这让我有过几次出局,但我错过了:(
namespace MyNS
{
    public static class TestExtensions
    {
        public static T SetTest<T>(this T definition, int value)
            where T :
        {
            definition.SetField("test", value);
            return definition;
        }
    }
}
var parameterConstraintClauseSyntax = SyntaxFactory.TypeParameterConstraintClause(
  SyntaxFactory.IdentifierName("T"),
  new SeparatedSyntaxList<TypeParameterConstraintSyntax>()
   .Add(SyntaxFactory.TypeConstraint(SyntaxFactory.ParseTypeName("Test"))));

methodSyntax = methodSyntax.AddConstraintClauses(parameterConstraintClauseSyntax);