我正在尝试生成一个引用另一个程序集中定义的类型的类。
我的代码如下:
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。我想在所有代码生成的最后完成一个编译阶段。