簡體   English   中英

使用 roslyn,如何獲得一種“var”?

[英]using roslyn, how to get a type of '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 ,第二個返回{?}

Get Type of 'var' with Roslyn它提供的方法也不起作用。 調試信息附在下圖中。 可以看到這些值都是 null 或 {?}。 在此處輸入圖片說明

我的代碼看起來像這樣

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);
    }
}

我在 Visual Studio 2019 中嘗試了 Syntax Visualizer 工具,它顯示了正確的類型。 在此處輸入圖片說明

在此處輸入圖片說明

GetDiagnostic() 的結果如下:

COUNT:  32
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (0,6)-(0,12)未能找到類型或命名空間名“System”(是否缺少 using 指令或程序集引用?)
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (1,6)-(1,12)未能找到類型或命名空間名“System”(是否缺少 using 指令或程序集引用?)
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (2,6)-(2,12)未能找到類型或命名空間名“System”(是否缺少 using 指令或程序集引用?)
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (3,6)-(3,12)未能找到類型或命名空間名“System”(是否缺少 using 指令或程序集引用?)
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (6,6)-(6,13)未能找到類型或命名空間名“Entitas”(是否缺少 using 指令或程序集引用?)
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (10,111)-(10,128)未能找到類型或命名空間名“IInitializeSystem”(是否缺少 using 指令或程序集引用?)
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (14,15)-(14,19)預定義類型“System.Void”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (20,54)-(20,60)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (20,54)-(20,60)未能找到類型或命名空間名“Entity”(是否缺少 using 指令或程序集引用?)
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (20,79)-(20,97)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (20,27)-(20,31)預定義類型“System.Void”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (12,16)-(12,41)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (16,24)-(16,32)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (16,24)-(16,32)當前上下文中不存在名稱“GetWorld”
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (17,60)-(17,85)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (22,24)-(22,32)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (22,24)-(22,32)當前上下文中不存在名稱“GetWorld”
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (23,12)-(23,42)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (23,53)-(23,83)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (23,53)-(23,83)預定義類型“System.Void”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (24,65)-(24,95)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (24,97)-(24,101)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (24,97)-(24,101)未能找到類型或命名空間名“Game”(是否缺少 using 指令或程序集引用?)
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (26,45)-(26,75)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (26,77)-(26,81)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (26,77)-(26,81)未能找到類型或命名空間名“Game”(是否缺少 using 指令或程序集引用?)
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (32,12)-(32,30)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (34,16)-(34,107)預定義類型“System.Boolean”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (38,16)-(38,30)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (38,31)-(38,40)預定義類型“System.Object”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (38,16)-(38,47)預定義類型“System.Boolean”未定義或導入
I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs: (40,20)-(40,111)預定義類型“System.Boolean”未定義或導入
methodDeclaration:Initialize
varibale.Identifier:world
varibale.Initializer:= GetWorld()

methodDeclaration:HandleReliableRequest
varibale.Identifier:world
varibale.Initializer:= GetWorld()

I:\gameplay\Test\GamePlay\System\GameModeSystems\JokerMode\JokerProcessPlayerStatisSystems.cs

我似乎找到了解決辦法。 我把它放在這里給有同樣困惑的人。 如果你有更好的方法,歡迎你寫在下面。 謝謝。

        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()中添加了一些代碼。一般情況下,添加了相應的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM