相关疑难解决方法(0)

使用Roslyn将自动实现的属性添加到类

我试图通过从头开始构建现有但简单的应用程序来学习Roslyn,这似乎是一种有效的方法来学习它.无论如何,我有以下代码:

var root = (CompilationUnitSyntax)document.GetSyntaxRoot();

    // Add the namespace
    var namespaceAnnotation = new SyntaxAnnotation();
    root = root.WithMembers(
        Syntax.NamespaceDeclaration(
            Syntax.ParseName("ACO"))
                .NormalizeWhitespace()
                .WithAdditionalAnnotations(namespaceAnnotation));
    document = document.UpdateSyntaxRoot(root);

    // Add a class to the newly created namespace, and update the document
    var namespaceNode = (NamespaceDeclarationSyntax)root
        .GetAnnotatedNodesAndTokens(namespaceAnnotation)
        .Single()
        .AsNode();

    var classAnnotation = new SyntaxAnnotation();
    var baseTypeName = Syntax.ParseTypeName("System.Windows.Forms.Form");
    SyntaxTokenList syntaxTokenList = new SyntaxTokenList()
        {
            Syntax.Token(SyntaxKind.PublicKeyword)
        };

    var newNamespaceNode = namespaceNode
        .WithMembers(
            Syntax.List<MemberDeclarationSyntax>(
                Syntax.ClassDeclaration("MainForm")
                    .WithAdditionalAnnotations(classAnnotation)
                    .AddBaseListTypes(baseTypeName)
                    .WithModifiers(Syntax.Token(SyntaxKind.PublicKeyword))));

    root = root.ReplaceNode(namespaceNode, newNamespaceNode).NormalizeWhitespace();
    document = document.UpdateSyntaxRoot(root);


    var attributes …
Run Code Online (Sandbox Code Playgroud)

c# automatic-properties roslyn

11
推荐指数
2
解决办法
3189
查看次数

如何从头开始构建Roslyn语法树?

我想做一些非常基本的代码生成(将服务API规范转换为某些C#类以与服务进行通信).我发现这个问题似乎表明我可以调用Syntax.CompilationUnit()创建一个新的CompilationUnityntax,但是我无法编译这个代码; 我找不到CompilationUnit任何我能找到的语法类的方法(我也找不到任何文档):(

CSharpSyntaxTree.Create似乎需要一个CSharpSyntaxNode,但我无法弄清楚如何创建其中之一:/

我正在使用VS 2015 RC和最新的Microsoft.CodeAnalysis NuGet包(1.0.0-rc2).

c# roslyn visual-studio-2015

10
推荐指数
1
解决办法
2158
查看次数

从一开始就建立IDocument的最有效方法是什么

我想使用以下类作为一个具体的例子逐步构建一个新的IDocument对象.您可以从任何您喜欢的对象开始,并使用您喜欢的任何中间对象,只要生成的对象是一个IDocument,它代表最后的完整类.

步骤#1:添加一个名为MyNamespace的新命名空间.打印出当前对象应该如下所示:

namespace MyNamespace
{
}
Run Code Online (Sandbox Code Playgroud)

步骤2:向名为MyClass的命名空间添加一个新类.打印出当前对象应该如下所示:

namespace MyNamespace
{
    public class MyClass
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤3:向此类添加一个名为MyMethod的新方法.打印出当前对象应该如下所示:

namespace MyNamespace
    {
        public class MyClass
        {
            public void MyMethod()
            {
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,理论上似乎有很多方法可以解决这个问题,或者至少错误地断定你可以解决这个问题.各种不同对象中的无尽方法和构造函数,如WithChanges,UpdateDocument,各种语法对象上的方法,ParseCompilationUnit等.

基本上,我想以增量的方式构建它,在每个步骤都有一个独特的对象,例如,我可以打印到控制台,而不是一个在一行中创建整个事物的大声明.我已经多次阅读了6月发布的CTP所附的所有文档,正如我所提到的,我在各种构造函数和方法的看似无穷无尽的组合中迷失了.此外,我也对将性能考虑在内的方式感兴趣.

.net c# c#-4.0 roslyn

2
推荐指数
1
解决办法
811
查看次数