2017-04-11 41 views
2

我可以用一個SyntaxGenerator產生類型的參數的Int32是這樣的...如何爲任意類型創建Roslyn ITypeSymbol?

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

我應該使用什麼等價代碼來創建類型的數據集的參數?

我相信我需要創建一個ITypeSymbol傳遞給generator.TypeExpression,但如何做到這一點?

+0

在什麼情況下你要做到這一點?你有沒有訪問語義模型或​​編譯?如果是這樣,那麼你可以使用'SyntaxFactory.ParseTypeName()'從任何類型名稱中獲得'TypeSyntax'。然後,可以通過語義模型獲取類型符號。 – Tamas

+0

瞭解到我對Roslyn很新... 我試圖從DiagnosticAnalyzers,CodeFixProviders和RefactoringProviders的上下文中做到這一點,但是對於Roslyn來說是新的,我不確定我在處理中有什麼這種情況。 我希望能夠以與語言無關的方式實現此目的,因此使用SyntaxGenerator而不是SyntaxFactory,但如果可以在運行時找到對正確的SyntaxFactory的引用,那麼可能會有效。 –

回答

1

如果你有機會到Compilation,你可以使用GetTypeByMetadataName,如this blog postthis SO answer解釋說:

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

因此,鑑於我處於DiagnosticAnalyzer,CodeFixProvider或RefactoringProvider內,我可以從哪裏獲得彙編? –

+0

在分析器中,您應該能夠從分析上下文中獲取它。我猜想對於其他情況它是相似的。 – svick

+0

看起來不像其他2那樣。但是他們確實有一個Document.Project.GetCompilationAsync方法,它看起來很好。 :) –

相關問題