используя roslyn, как получить тип 'var'?
Я хочу получить тип, представленный
var
.
var localDeclaration = methodDeclaration.DescendantNodes().OfType<LocalDeclarationStatementSyntax>().First();
var identifierName = localDeclaration.DescendantNodes().OfType<IdentifierNameSyntax>().First();
var symbolInfo = semanticModel.GetSymbolInfo(identifierName);
var typeSymbol = semanticModel.GetTypeInfo(identifierName).Type;
Я пытался
GetSymbolInfo()
а также
GetTypeInfo()
, первый возвращается
null
, второй возвращается
{?}
.
Получить тип 'var' с помощью Roslyn . Метод, который он предоставляет, также не работает. Отладочная информация представлена на рисунке ниже. Вы можете видеть, что все эти значения равны нулю или {?}.
Мой код выглядит так
public class Start
{
static void Main(string[] args)
{
InitEnvironment();
Run();
Console.ReadLine();
}
private static void InitEnvironment()
{
GlobalVariable.MySolution = MSBuildWorkspace.Create().OpenSolutionAsync(ConstVariable.SolutionPath).Result;
GlobalVariable.MyProject = GlobalVariable.MySolution.Projects.First(x => x.Name == "GamePlay");
GlobalVariable.CompilationByAll = GlobalVariable.MyProject.GetCompilationAsync().Result;
}
private static void Run()
{
var tree = SyntaxTreeProcessor.GetSyntaxTreeByFileName(ConstVariable.SystemPath + @"\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs");
var semanticModel = GlobalVariable.CompilationByAll.GetSemanticModel(tree);
var methodDeclarations = tree.GetRoot().DescendantNodes().OfType<MethodDeclarationSyntax>().ToList();
foreach(var methodDeclaration in methodDeclarations)
{
Console.WriteLine($"methodDeclaration:{methodDeclaration.Identifier.ValueText}");
var localDeclaration = methodDeclaration.DescendantNodes().OfType<LocalDeclarationStatementSyntax>().First();
var identifierName = localDeclaration.DescendantNodes().OfType<IdentifierNameSyntax>().First();
foreach (var varibale in localDeclaration.Declaration.Variables)
{
Console.WriteLine($"varibale.Identifier:{varibale.Identifier}");
Console.WriteLine($"varibale.Initializer:{varibale.Initializer}");
}
var variableType = semanticModel.GetSymbolInfo(localDeclaration.Declaration.Type).Symbol;
var typeSymbol = semanticModel.GetTypeInfo(identifierName).Type;
var symbolInfo = semanticModel.GetSymbolInfo(identifierName);
}
Console.WriteLine(tree.FilePath);
}
}
Я попробовал инструмент Syntax Visualizer в Visual Studio 2019, и он показал правильный тип.
1 ответ
Решение
Кажется, я нашел решение. Я поместил это здесь для людей с таким же замешательством. Если у вас есть способ получше, вы можете записать его ниже. Благодарю.
private static void InitEnvironment()
{
GlobalVariable.MySolution = MSBuildWorkspace.Create().OpenSolutionAsync(ConstVariable.SolutionPath).Result;
var metadataReferenceCustomDlls = Directory.GetFiles(@"I:\gameplay\Library\", "*.dll");
var metadataReferences = metadataReferenceCustomDlls.Select(f => MetadataReference.CreateFromFile(f)).ToList();
var metadataReferenceNetStandardDlls = Directory.GetFiles(@"C:\Users\user\.nuget\packages\netstandard.library\2.0.3\build\netstandard2.0\ref\", "*.dll");
var metadataReferencesB = metadataReferenceNetStandardDlls.Select(f => MetadataReference.CreateFromFile(f)).ToList();
metadataReferences = metadataReferences.Concat(metadataReferencesB).ToList();
foreach (var projectId in GlobalVariable.MySolution.ProjectIds.ToArray())
{
GlobalVariable.MySolution = GlobalVariable.MySolution.AddMetadataReferences(projectId, metadataReferences);
}
GlobalVariable.MyProject = GlobalVariable.MySolution.Projects.First(x => x.Name == "GamePlay");
GlobalVariable.CompilationByAll = GlobalVariable.MyProject.GetCompilationAsync().Result;
}
Я добавил код в InitEnvironment(). В общем, добавлена соответствующая ссылка.