[英]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.