【问题标题】:Roslyn code generation, how to create a type expression for a given typeRoslyn 代码生成,如何为给定类型创建类型表达式
【发布时间】:2020-04-21 00:55:03
【问题描述】:

我正在尝试使用 Roslyn 生成代码。我创建了一个这样的方法:

var workspace = new AdhocWorkspace();
var generator = SyntaxGenerator.GetGenerator(workspace, LanguageNames.CSharp);

var parameters = new SyntaxNode[] { generator.ParameterDeclaration("MyParam", generator.TypeExpression(SpecialType.System_Boolean))};

var body = ...

var method = generatpr.MethodDeclaration(
   "MyMethod", 
   parameters,
   null, 
   null,
   Accessibility.Public,
   DeclarationModifiers.Virtual,
   new SyntaxNode[] { body});

我的问题是,如何创建其他类型的参数,如 Guid,或其他结构或类?我可以用与语言无关的方式来做吗?

【问题讨论】:

  • 对我最有帮助的是 Compilation.GetTypeByMetadataName,但我需要一个 Compilation 对象的实例。我怎么得到它?
  • 默认文字
  • @EvanTrimboli - 我也看到了,但它需要编译。因为我在生成代码,所以我有一个 SyntaxGenerator 实例,我有一个 Type 对象的实例,所以我使用了 SyntaxGenerator.IdentifierName() 函数,并传入了 Type 实例的 FullName 属性。
  • 我知道它可能不适用于您的用例,但实际上以防万一,我想提一下,您可以使用静态类 Microsoft.CodeAnalysis.CSharp.SyntaxFactory 而不是 SyntaxGenerator - 它有更多方法并且不需要工作区即可运行。

标签: c# roslyn


【解决方案1】:

yntaxGenerator 实例,我有一个 Type 对象的实例,所以我使用了 SyntaxGenerator.IdentifierName() 函数,并传入了 Type 实例的 FullName 属性。

var workspace = new AdhocWorkspace();
var generator = SyntaxGenerator.GetGenerator(workspace, LanguageNames.CSharp);

var parameters = new SyntaxNode[] { generator.ParameterDeclaration("MyParam", generator.IdentifierName(typeParameter.FullName))};

var body = ...

var method = generatpr.MethodDeclaration(
   "MyMethod", 
   parameters,
   null, 
   null,
   Accessibility.Public,
   DeclarationModifiers.Virtual,
   new SyntaxNode[] { body});

【讨论】:

    猜你喜欢
    • 2018-07-03
    • 2018-04-15
    • 2017-09-07
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多