我试图通过从头开始构建现有但简单的应用程序来学习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) 我想做一些非常基本的代码生成(将服务API规范转换为某些C#类以与服务进行通信).我发现这个问题似乎表明我可以调用Syntax.CompilationUnit()创建一个新的CompilationUnityntax,但是我无法编译这个代码; 我找不到CompilationUnit任何我能找到的语法类的方法(我也找不到任何文档):(
CSharpSyntaxTree.Create似乎需要一个CSharpSyntaxNode,但我无法弄清楚如何创建其中之一:/
我正在使用VS 2015 RC和最新的Microsoft.CodeAnalysis NuGet包(1.0.0-rc2).
我想使用以下类作为一个具体的例子逐步构建一个新的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所附的所有文档,正如我所提到的,我在各种构造函数和方法的看似无穷无尽的组合中迷失了.此外,我也对将性能考虑在内的方式感兴趣.