如何在不进行编译的情况下从引用的程序集中获取ITypeSymbol

时间:2018-08-09 07:13:55

标签: c# code-generation roslyn

我正在尝试生成一个引用另一个程序集中定义的类型的类。

我的代码如下:

var workspace = new AdhocWorkspace();
var generator = SyntaxGenerator.GetGenerator(workspace, LanguageNames.CSharp);
...
INamedTypeSymbol formService = ...
...
var field = generator.FieldDeclaration("service", 
      generator.TypeExpression(formService), 
      Accessibility.Private,
      DeclarationModifiers.ReadOnly);

我想要一种简单,干净的方法来获取formService-这是在另一个程序集中定义的接口。

现在要获取此引用,我正在创建一个文档,向我的库添加一个引用,并使用Documents SemanticModel来获取类型:

var project = workspace.AddProject("DummyProject", 
                    LanguageNames.CSharp);
var metadataReference = 
     MetadataReference.CreateFromFile(/* Assembly containing my type */);
project = project.AddMetadataReference(metadataReference);
var document = project.AddDocument("DummyDocument.cs", ...);
var semanticModel = await document.GetSemanticModelAsync();

var formService = semanticModel
     .Compilation.GetTypeByMetadataName("FormService.Shared.IFormService")

我不需要Project,Document或SemanticModel,因此我不想全部创建它们来获得此符号。

我知道我可以用SyntaxFactory代码替换字段声明:

var field = SyntaxFactory.FieldDeclaration(
        SyntaxFactory.VariableDeclaration(
            SyntaxFactory.ParseTypeName("FormService.Shared.IFormService"))
                .AddVariables(
                    SyntaxFactory.VariableDeclarator("service")))
            .AddModifiers(
                SyntaxFactory.Token(SyntaxKind.PrivateKeyword), 
                SyntaxFactory.Token(SyntaxKind.ReadOnlyKeyword));

如果可以避免的话,我宁愿不要混合使用SyntaxFactory和SyntaxGenerator代码。

还有另一种方法来获取另一个程序集中定义的类型的INamedTypeSymbol吗?

我也有另一个类似的问题-我想为我使用generator.ClassDeclaration(...)创建的类型提供INamedTypeSymbol吗?有没有办法做到这一点?目前,我正在编译该类,并使用上述SemanticModel来获取INamedTypeSymbol。我想在所有代码生成的最后完成一个编译阶段。

0 个答案:

没有答案