Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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# 从ObjectCreationExpressionSyntax获取ITypeSymble 我想达到的目标_C#_Roslyn_Roslyn Code Analysis - Fatal编程技术网

C# 从ObjectCreationExpressionSyntax获取ITypeSymble 我想达到的目标

C# 从ObjectCreationExpressionSyntax获取ITypeSymble 我想达到的目标,c#,roslyn,roslyn-code-analysis,C#,Roslyn,Roslyn Code Analysis,我想编写一个代码分析器,它可以分析任何ObjectCreationExpression,例如: FruitMix fm = new FruitMix(); 并允许我找出该类型实现的接口,如果找到特定接口,则执行操作 我试过的 我通过以下方式注册SyntaxNodeAction拦截了分析: public override void Initialize(AnalysisContext context) { context.RegisterSyntaxNodeAction(c=> A

我想编写一个代码分析器,它可以分析任何
ObjectCreationExpression
,例如:

FruitMix fm = new FruitMix();
并允许我找出该类型实现的接口,如果找到特定接口,则执行操作

我试过的 我通过以下方式注册SyntaxNodeAction拦截了分析:

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(c=> AnalyzeObjectCreation(c), SyntaxKind.ObjectCreationExpression);         
}
为了获得接口,ITypeSymble似乎是我试图在注册方法中获得的方法:

private static void AnalyzeObjectCreation(SyntaxNodeAnalysisContext context)
{
    ObjectCreationExpressionSyntax objectCreation = (ObjectCreationExpressionSyntax) context.Node;

    //How do I get an INamedTypeSymbol here?

    //INamedTypeSymbol typeSyntax = (INamedTypeSymbol)objectCreation.Type;
    //ISymbol test = typeSyntax.AssociatedSymbol;    
    //ISymbol test = context.SemanticModel.GetDeclaredSymbol(context.Node);
    //SymbolInfo symbolInfo = context.SemanticModel.GetDeclaredSymbol()
}
正如你所看到的,我在网上找到的所有东西都试过了,但都没有用。也许我根本不应该去寻找一个INamedTypeSymbol——如果是的话,我需要什么

您能给我指一下正确的方向吗?

您需要在
ObjectCreationSyntax
上使用

(在您的示例中,您可以使用
上下文
上的
语义模型
,这只是一个自包含的示例)

var-tree=CSharpSyntaxTree.ParseText(@)
使用制度;
公共类MyClass
{
公共MyClass()
{
}
}
公共课程
{
公共静态void Main()
{
var x=新的MyClass();
}   
}");
var mscorlib=MetadataReference.CreateFromFile(typeof(object.Assembly.Location));
var compilation=csharpcomilation.Create(“MyCompilation”,
syntaxTrees:new[]{tree},references:new[]{mscorlib});
var model=compilation.GetSemanticModel(树);
var objectCreationSyntax=tree.GetRoot().genderantnodes().OfType().Single();
var namedTypeSymbol=model.GetSymbolInfo(objectCreationSyntax).Symbol;
看起来您在玩
GetDeclaredSymbol()
,它可能返回null。我喜欢使用的规则是:

  • 使用
    GetDeclaredSymbol()
    处理名称为
    DeclarationSyntax
    的任何语法
  • 对于所有其他语法,请使用
    GetSymbolInfo()
您将希望在
对象CreationSyntax
上使用

(在您的示例中,您可以使用
上下文
上的
语义模型
,这只是一个自包含的示例)

var-tree=CSharpSyntaxTree.ParseText(@)
使用制度;
公共类MyClass
{
公共MyClass()
{
}
}
公共课程
{
公共静态void Main()
{
var x=新的MyClass();
}   
}");
var mscorlib=MetadataReference.CreateFromFile(typeof(object.Assembly.Location));
var compilation=csharpcomilation.Create(“MyCompilation”,
syntaxTrees:new[]{tree},references:new[]{mscorlib});
var model=compilation.GetSemanticModel(树);
var objectCreationSyntax=tree.GetRoot().genderantnodes().OfType().Single();
var namedTypeSymbol=model.GetSymbolInfo(objectCreationSyntax).Symbol;
看起来您在玩
GetDeclaredSymbol()
,它可能返回null。我喜欢使用的规则是:

  • 使用
    GetDeclaredSymbol()
    处理名称为
    DeclarationSyntax
    的任何语法
  • 对于所有其他语法,请使用
    GetSymbolInfo()

谢谢-GetSymbolInfo已返回我需要的内容。我现在的问题是,在注册位置时,我无法获得创建对象的位置(而不是定义类的位置)。你有什么想法吗?那将是你原来的
ObjectDeclarationSyntax
。你可以在上面使用
.GetLocation()
。谢谢“.GetLocation()”给了我想要的谢谢-GetSymbolInfo已经返回了我需要的东西。我现在的问题是,在注册位置时,我无法获得创建对象的位置(而不是定义类的位置)。你有什么想法吗?那将是你原来的
ObjectDeclarationSyntax
。你可以在上面使用
.GetLocation()
。谢谢“.GetLocation()”给了我想要的
var tree = CSharpSyntaxTree.ParseText(@"
using System;
public class MyClass
{
    public MyClass()
    {
    }
}
public class Program
{
    public static void Main()
    {
        var x = new MyClass();  
    }   
}");

var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create("MyCompilation",
    syntaxTrees: new[] { tree }, references: new[] { mscorlib });

var model = compilation.GetSemanticModel(tree);
var objectCreationSyntax = tree.GetRoot().DescendantNodes().OfType<ObjectCreationExpressionSyntax>().Single();

var namedTypeSymbol = model.GetSymbolInfo(objectCreationSyntax).Symbol;