Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从roslyn中的符号获取类型_C#_.net_Reflection_Roslyn_Roslyn Code Analysis - Fatal编程技术网

C# 从roslyn中的符号获取类型

C# 从roslyn中的符号获取类型,c#,.net,reflection,roslyn,roslyn-code-analysis,C#,.net,Reflection,Roslyn,Roslyn Code Analysis,从Microsoft.CodeAnalysis.ISymbol获取不同类型符号的System.Type的最佳通用方法是什么?(例如类声明、变量、属性等) 我希望能够对该类型执行各种检查,例如,检查该类型是否实现了任何接口,或者是否可以强制转换为任何接口,就像可以检查System.type一样 我遇到的问题是,大多数用于表示符号的具体类都是内部的(请参阅),我在ISymbol中找不到类型信息 SourceNamedTypeSymbol 本地符号 我使用以下代码检索ISymbol var obj

从Microsoft.CodeAnalysis.ISymbol获取不同类型符号的System.Type的最佳通用方法是什么?(例如类声明、变量、属性等)

我希望能够对该类型执行各种检查,例如,检查该类型是否实现了任何接口,或者是否可以强制转换为任何接口,就像可以检查System.type一样

我遇到的问题是,大多数用于表示符号的具体类都是内部的(请参阅),我在ISymbol中找不到类型信息

  • SourceNamedTypeSymbol
  • 本地符号
我使用以下代码检索ISymbol

var objectSymbol = (ISymbol)model.GetDeclaredSymbol(obj.Node);

简单回答:你不能。没有合适的方法获取
系统。请从
ISymbol
(Roslyn)键入
(反射)

一种方法是构造类型的完全限定名,然后通过反射()查找它

你可能应该问问自己,这是否是你首先需要做的事情——reflection和Roslyn并不是真的打算一起工作

然而,你感兴趣的事情也可以通过Roslyn来完成。这里的关键是使用语义模型,它为您提供了所有这些信息。 所有声明(与用法相反)都有一个特定的可用重载,允许您获取声明符号并以适当的类型返回它(在本例中,例如
INamedTypeSymbol

以以下为例:

const string source = @"
using System;

namespace MyNamespace 
{
    class MyClass : IDisposable
    {
        void Method()
        {
            MyClass nameOfVariable, another;
        }
    }
}
";
var tree = CSharpSyntaxTree.ParseText(source);
var compilation = CSharpCompilation.Create("MyCompilation", new[] { tree }, new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) });
var semanticModel = compilation.GetSemanticModel(tree);
var root = tree.GetRoot();

var classSymbol = semanticModel.GetDeclaredSymbol(root.DescendantNodes().OfType<ClassDeclarationSyntax>().First());
Console.WriteLine(string.Join(", ", classSymbol.AllInterfaces));

我想这就是你想要的:

var castedProperty=(IPropertySymbol)属性;
变量类型=castedProperty.type.Name;

变量“property”是一个ISymbol实例。

感谢您的回复,我能够得到结果!并强调为什么没有简单的方法:完全有可能你实际上得不到一个。获取System.Type的唯一方法是让反射加载有问题的程序集,但可能一开始就没有可加载的程序集。从根本上说,反射是一个运行时API,运行时和编译时是不同的。正如Jeroen的精彩回答所描述的那样,您最好始终使用Roslyn API。您正在寻找
INamedTypeSymbol
var objectSymbol = (INamedTypeSymbol) model.GetDeclaredSymbol(obj.Node);