c# - rosslyn - roslyn significado
Obtener el tipo de ''var'' con Roslyn? (2)
Tengo un archivo .cs llamado ''test.cs'' que esencialmente se ve así:
namespace test
{
public class TestClass
{
public void Hello()
{
var x = 1;
}
}
}
Estoy tratando de analizar esto con Roslyn y obtener el tipo de x, que debería ser ''int'', pero solo puedo descubrir que es de tipo ''var'', no puedo obtener el tipo subyacente real.
Aquí está básicamente lo que mi código es ahora
var location = "test.cs";
var sourceTree = CSharpSyntaxTree.ParseFile(location);
var root = (CompilationUnitSyntax)sourceTree.GetRoot();
foreach (var member in root.Members)
{
//...get to a method
var method = (MethodDeclarationSyntax())member;
foreach (var child in method.Body.ChildNodes())
{
if (child is LocalDeclarationStatementSyntax)
{
//var x = 1;
child.Type.RealType()?
}
}
}
¿Cómo puedo obtener el tipo real de niño? He visto algunas cosas que dicen que debo usar un Modelo semántico o una Solución o un Área de trabajo, pero parece que no puedo descubrir cómo cargar mi solución de prueba con Roslyn y luego obtener el tipo de ''x''.
Además, no he podido encontrar ninguna documentación de Roslyn realmente buena, todo parece estar distribuido entre un montón de versiones diferentes y nada para principiantes como yo. ¿Alguien sabe de una ''introducción a Roslyn'' o un inicio rápido similar que pueda leer?
Para obtener el tipo real para una variable declarada usando var
, llame a GetSymbolInfo()
en el SemanticModel
. Puede abrir una solución existente utilizando MSBuildWorkspace
, luego enumerar sus proyectos y sus documentos. Use un documento para obtener su SyntaxRoot
y SemanticModel
, luego busque VariableDeclarations
y recupere los símbolos para el Type
de una variable declarada como esta:
var workspace = MSBuildWorkspace.Create();
var solution = workspace.OpenSolutionAsync("c://path//to//solution.sln").Result;
foreach (var document in solution.Projects.SelectMany(project => project.Documents))
{
var rootNode = document.GetSyntaxRootAsync().Result;
var semanticModel = document.GetSemanticModelAsync().Result;
var variableDeclarations = rootNode
.DescendantNodes()
.OfType<LocalDeclarationStatementSyntax>();
foreach (var variableDeclaration in variableDeclarations)
{
var symbolInfo = semanticModel.GetSymbolInfo(variableDeclaration.Declaration.Type);
var typeSymbol = symbolInfo.Symbol; // the type symbol for the variable..
}
}
Vea la prueba de la unidad llamada TestGetDeclaredSymbolFromLocalDeclarator en el árbol de origen de Roslyn.