【问题标题】:How to create a Roslyn ITypeSymbol for an arbitrary type?如何为任意类型创建 Roslyn ITypeSymbol?
【发布时间】:2017-09-07 11:35:24
【问题描述】:

我可以使用 SyntaxGenerator 来生成 Int32 类型的参数,就像这样...

var generator = SyntaxGenerator.GetGenerator(document);
var paramType = generator.TypeExpression(SpecialType.System_Int32);
var param = generator.ParameterDeclaration("MyParam", paramType);

我应该使用什么等效代码来创建 Dataset 类型的参数?

我想我需要创建一个 ITypeSymbol 来传递给 generator.TypeExpression,但是该怎么做呢?

【问题讨论】:

  • 你想在什么情况下这样做?您可以访问语义模型或​​编译吗?如果是这样,那么您可以使用SyntaxFactory.ParseTypeName() 从任何类型名称中获取TypeSyntax。然后,就可以通过语义模型得到类型符号了。
  • 了解我对 Roslyn 很陌生...我试图从 DiagnosticAnalyzers、CodeFixProviders 和 RefactoringProviders 的上下文中执行此操作,但对于 Roslyn 来说是新手,我不确定我要做什么在这种情况下,我可以随意使用。我希望以与语言无关的方式实现这一点,因此使用 SyntaxGenerator 而不是 SyntaxFactory,尽管如果可以找到一种方法来在运行时获取对正确 SyntaxFactory 的引用,那么这可能会起作用。

标签: c# code-generation roslyn


【解决方案1】:

如果您有权访问Compilation,则可以使用GetTypeByMetadataName,如this blog post 和this SO answer 中所述:

var dataSetType = compilation.GetTypeByMetadataName("System.Data.DataSet");
var paramType = generator.TypeExpression(dataSetType);
var param = generator.ParameterDeclaration("MyParam", paramType);

【讨论】:

  • 既然我在 DiagnosticAnalyzer、CodeFixProvider 或 RefactoringProvider 中,我可以从哪里获得编译?
  • 在分析器中,您应该能够从分析上下文中获取它。我猜其他情况也差不多。
  • 看起来不像其他两个有那个。但是,他们确实有一个 Document.Project.GetCompilationAsync 方法,它似乎同样好。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2021-01-22
相关资源
最近更新 更多