C# 从已解析源外部声明的类型的标识符获取SymbolInfo
我想使用Roslyn来解析C#代码,并且我想获得代码中每个引用类型的限定名 例如,假设我想解析这段代码:C# 从已解析源外部声明的类型的标识符获取SymbolInfo,c#,.net,roslyn,C#,.net,Roslyn,我想使用Roslyn来解析C#代码,并且我想获得代码中每个引用类型的限定名 例如,假设我想解析这段代码: using System; namespace RoslynTest { public class Test { public static void Main() { String a = "Hello, World!"; Console.WriteLine(a); }
using System;
namespace RoslynTest
{
public class Test
{
public static void Main()
{
String a = "Hello, World!";
Console.WriteLine(a);
}
}
}
要解析它,我使用以下代码:
SyntaxTree tree = CSharpSyntaxTree.ParseText(source);
CSharpCompilation compilation = CSharpCompilation.Create("test", new[] { tree });
SemanticModel semanticModel = compilation.GetSemanticModel(tree, false);
CompilationUnitSyntax root = (CompilationUnitSyntax)tree.GetRoot();
IEnumerable<IdentifierNameSyntax> identifiers = root.DescendantNodes()
.Where(s => s is IdentifierNameSyntax)
.Cast<IdentifierNameSyntax>();
foreach (IdentifierNameSyntax i in identifiers)
{
SymbolInfo info = semanticModel.GetSymbolInfo(i);
if (info.Symbol == null)
{
Console.WriteLine("Unknown :(");
}
else
{
Console.WriteLine(info.Symbol.ContainingNamespace?.Name + "." + info.Symbol.ContainingType?.Name + "." + info.Symbol.Name);
}
}
SyntaxTree-tree=CSharpSyntaxTree.ParseText(源代码);
csharpcomilation=csharpcomilation.Create(“test”,new[]{tree});
SemanticModel SemanticModel=compilation.GetSemanticModel(树,false);
CompilationUnitSyntax根=(CompilationUnitSyntax)树。GetRoot();
IEnumerable标识符=根。子代节点()
.其中(s=>s是IdentifierNameSyntax)
.Cast();
foreach(标识符中的IdentifierNameSyntax i)
{
SymbolInfo=semanticModel.GetSymbolInfo(i);
如果(info.Symbol==null)
{
Console.WriteLine(“未知:(”);
}
其他的
{
Console.WriteLine(info.Symbol.ContainingNamespace?.Name+“+info.Symbol.ContainingType?.Name+”+info.Symbol.Name);
}
}
在本例中,当我访问描述“String”的IdentifierNameSyntax时,info.Symbol将为null。我想通过某种方式了解全名System.String,以及引用的其他类型的全名
- 如何从IdentifierNameSyntax获取解析源外部声明的类型的SymbolInfo
- 有没有办法从using语句构造语义模型
字符串
类型
如果查看SemanticModel中的编译错误,您将看到一个类似的错误
您需要在编译
中添加对mscorlib的引用,以便System.String
存在。
一旦这样做,
info.Symbol
将不会为空。您的实际问题是没有字符串
类型
如果查看SemanticModel中的编译错误,您将看到一个类似的错误
您需要在编译
中添加对mscorlib的引用,以便System.String
存在。
一旦这样做,
info.Symbol
将不会为空。另外,只需切题如下:
IEnumerable<IdentifierNameSyntax> identifiers =
root.DescendantNodes().OfType<IdentifierNameSyntax>();
IEnumerable标识符=
类型()的root.degenantNodes();
而不是:
IEnumerable<IdentifierNameSyntax> identifiers = root.DescendantNodes()
.Where(s => s is IdentifierNameSyntax)
.Cast<IdentifierNameSyntax>();
IEnumerable标识符=根目录下的子目录节点()
.其中(s=>s是IdentifierNameSyntax)
.Cast();
另外,切题如下:
IEnumerable<IdentifierNameSyntax> identifiers =
root.DescendantNodes().OfType<IdentifierNameSyntax>();
IEnumerable标识符=
类型()的root.degenantNodes();
而不是:
IEnumerable<IdentifierNameSyntax> identifiers = root.DescendantNodes()
.Where(s => s is IdentifierNameSyntax)
.Cast<IdentifierNameSyntax>();
IEnumerable标识符=根目录下的子目录节点()
.其中(s=>s是IdentifierNameSyntax)
.Cast();
使用.OfType()
,并使用info.Symbol.ToString()
。使用.OfType()
,并使用info.Symbol.ToString()
。谢谢,我添加了:元数据引用=元数据引用.CreateFromFile(typeof(string).Assembly.Location)
这就解决了我的示例。是否有任何实用的方法可以从所有using语句中创建元数据引用?谢谢,我添加了:MetadataReference=MetadataReference.CreateFromFile(typeof(string).Assembly.Location);
这就解决了我的例子。有没有实用的方法从所有using语句中创建元数据引用?