Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Roslyn向类中添加新字段声明_C#_Roslyn_Roslyn Code Analysis - Fatal编程技术网

C# 使用Roslyn向类中添加新字段声明

C# 使用Roslyn向类中添加新字段声明,c#,roslyn,roslyn-code-analysis,C#,Roslyn,Roslyn Code Analysis,有什么方法可以通过roslyn向类中添加成员?我想补充: public int number {get;set;} 更新 我使用了以下代码: PropertyDeclarationSyntax o = SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName("public System.Windows.Forms.Timer"), "Ticker { get; set; }")

有什么方法可以通过roslyn向类中添加成员?我想补充:

public int number {get;set;}
更新 我使用了以下代码:

       PropertyDeclarationSyntax o =  
       SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName("public  
       System.Windows.Forms.Timer"), "Ticker { get; set; }");

       var newRoot = root.ReplaceNode(oldMethod, oldMethod.AddMembers(o));
       newRoot = Formatter.Format(newRoot, new AdhocWorkspace());

       File.WriteAllText(file, newRoot.ToFullString());
但结果是:

   public class ClassChild
{
    public int n;
    private int n2;

    public void method1()
    {
        string c = "";
        Console.WriteLine();
    }

public System.Windows.Forms.TimerTicker { get; set; }
}
}

我想用n和n2内联public System.Windows.Forms.TimerTicker{get;set;}。我如何才能做到这一点?

请参阅代码

    private PropertyDeclarationSyntax MakeProperty()
    {
        string name = "n";

        // Create an auto-property
        var property =
            SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName("int"), name)
            .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
            .AddAccessorListAccessors(
                SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
                SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))
            );

        return property;
    }

    private async Task<Document> AddProperty(Document document, ClassDeclarationSyntax classeDecl, CancellationToken cancellationToken)
    {
        var root = await document.GetSyntaxRootAsync(cancellationToken);
        var newClass = classeDecl.AddMembers(MakeProperty());
        return document.WithSyntaxRoot(root.ReplaceNode(classeDecl, newClass));
    }
私有属性声明语法MakeProperty()
{
string name=“n”;
//创建自动属性
var特性=
SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName(“int”),名称)
.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
.AddAccessorListAccessor(
SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)。使用SemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)。带有SemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))
);
归还财产;
}
专用异步任务AddProperty(文档文档、ClassDeclarationSyntax classeDecl、CancellationToken CancellationToken)
{
var root=await document.GetSyntaxRootAsync(cancellationToken);
var newClass=classeDecl.AddMembers(MakeProperty());
返回文档.WithSyntaxRoot(root.ReplaceNode(classeDecl,newClass));
}

自动属性生成示例取自问题。

就我个人而言,我更喜欢这种技术:

public static class SyntaxHelpers
{
    public static T GenerateClassNode<T>(string decl) where T : CSharpSyntaxNode
    {
        var declaration = SyntaxFactory.ParseCompilationUnit(
            " public class FSM { \r\n" +
            $"{decl}\r\n" +
            " }} \r\n");

        var field = declaration.Members[0].DescendantNodes().First() as T;
        return field;
    }
}
公共静态类语法助手
{
公共静态T GenerateClassNode(字符串decl),其中T:CSharpSyntaxNode
{
var声明=SyntaxFactory.ParseCompliationUnit(
“公共类FSM{\r\n”+
$“{decl}\r\n”+
“}}\r\n”);
var field=declaration.Members[0].子代节点().First()作为T;
返回字段;
}
}
然后您可以按如下方式使用它:

string log4NetLoggerDeclaration =
                    "private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);";

var log4NetDeclarationStatement = SyntaxHelpers.GenerateClassNode<FieldDeclarationSyntax>(log4NetLoggerDeclaration);

string declarationString = log4NetLoggerDeclaration.ToString();
string log4NetLoggerDeclaration=
“私有静态只读log4net.ILog Logger=log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);”;
var log4NetDeclarationStatement=SyntaxHelpers.GenerateClassNode(log4NetLoggerDeclaration);
string declarationString=log4NetLoggerDeclaration.ToString();

您能扩展您想要实现的目标吗?创建用于添加值的analyzer\fixer或独立实用程序(用于生成过程,例如.ex.)?我想修复添加新字段的类。过去,我成功地向方法添加了一条新语句:/MethodDeclarationSyntax updateMethod=oldMethod.AddBodyStatements(ex)//var updateroot=root.ReplaceNode(oldMethod,updateMethod).NormalizeWhitespace();我也想做同样的事情你能帮我吗?还有其他问题:,,你试过了吗?是的,我试过了,但不管用