Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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语法重写器如何使用VisitMethodDeclaration中的指令添加_C#_Roslyn - Fatal编程技术网

C# Roslyn语法重写器如何使用VisitMethodDeclaration中的指令添加

C# Roslyn语法重写器如何使用VisitMethodDeclaration中的指令添加,c#,roslyn,C#,Roslyn,我正在使用Roslyn重写各种项目中的几个方法,并在某些情况下注入一个方法参数。这样做可以创建类似以下内容的输出: GetFilter(Data.Application.Interfaces.IDataSession session, string name) 但是,我希望它能做的是向类中添加一个Using指令,并添加参数,如下所示: GetFilter(IDataSession session, string name) 我看了几个例子,但我遗漏了一些东西。当我添加以下代码

我正在使用Roslyn重写各种项目中的几个方法,并在某些情况下注入一个方法参数。这样做可以创建类似以下内容的输出:

GetFilter(Data.Application.Interfaces.IDataSession session, string name)        
但是,我希望它能做的是向类中添加一个Using指令,并添加参数,如下所示:

GetFilter(IDataSession session, string name)
我看了几个例子,但我遗漏了一些东西。当我添加以下代码来更新Using时,它将停止任何操作

public class DbBaseReferencesMethodRewriter : CSharpSyntaxRewriter
{
    public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node)
    {
        if (RewriterUtility.HasDriveSessionParameter(node)) return node;

        // Start: Add to Using Directives
        var qualifiedName = SyntaxFactory.ParseName("Data.Application.Interfaces");
        var usingDirective = SyntaxFactory.UsingDirective(qualifiedName);
        var rootNode = node.SyntaxTree.GetRoot() as CompilationUnitSyntax;
        rootNode = rootNode.AddUsings(usingDirective).NormalizeWhitespace();
        // End:  Add to Using Directives

        return CreatesDbBaseWithParameterlessConstructor(node)
            ? node.PrependParameter(RewriterUtility.CreateDriveSessionParameter())
            : node;
    }

    private static bool CreatesDbBaseWithParameterlessConstructor(SyntaxNode node)
    {  
        return node.DescendantNodes()
            .OfType<ObjectCreationExpressionSyntax>()
            .Any(RewriterUtility.HasParameterlessDbBaseCall);
    }
}
公共类DbBaseReferencesMethodRewriter:CSharpSyntaxRewriter
{
公共重写SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax节点)
{
if(rewriteruptity.HasDriveSessionParameter(node))返回节点;
//开始:使用指令添加到
var qualifiedName=SyntaxFactory.ParseName(“Data.Application.Interfaces”);
var usingDirective=SyntaxFactory.usingDirective(qualifiedName);
var rootNode=node.SyntaxTree.GetRoot()作为CompilationUnitSyntax;
rootNode=rootNode.AddUsings(usingDirective.NormalizeWhitespace();
//结束:使用指令添加到
返回CreatesDbBaseWithParameterlessConstructor(节点)
?node.PrependParameter(RewriteRutibility.CreateDriveSessionParameter())
:节点;
}
私有静态bool使用无参数构造函数(SyntaxNode节点)创建SDBBbases
{  
返回node.degenantNodes()
第()类
.Any(可重写性.hasParameterlesDBBaseCall);
}
}

您创建了一个新的
rootNode
,但不将其应用于现有语法树)
        private (SyntaxTree, SyntaxTree) UpdateUsingDirectivesForChanges((SyntaxTree, SyntaxTree) change)
    {
        var qualifiedName = SyntaxFactory.ParseName(" Data.Application.Interfaces");
        var usingDirective = SyntaxFactory.UsingDirective(qualifiedName);
        var rootNode = change.Item2.GetRoot() as CompilationUnitSyntax;

        if (!rootNode.Usings.Select(d => d.Name.ToString()).Any(u => u == qualifiedName.ToString()))
        {
            rootNode = rootNode.AddUsings(usingDirective);
            change.Item2 = rootNode.SyntaxTree;
        }

         return change;
    }