используя 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(). В общем, добавлена ​​соответствующая ссылка.

Другие вопросы по тегам