如何使用Roslyn获得方法定义? [英] How to get method definition using Roslyn?

查看:0
本文介绍了如何使用Roslyn获得方法定义?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  1. 如何从MemberDeclarationSynTax对象单独获取方法声明?

  2. 如何将方法定义中的单行和多行注释替换为空。

    我们可以使用SynaxTriviaList做到这一点吗?

    在这里,我没有将任何对象分配给SynaxTriviaList。我们有没有办法
    从身体的定义中获取琐碎信息。

  3. 如何单独获取方法名称。

    private string GetMethodsInSourceFile(string fileName)
    {            
        SyntaxTree tree = SyntaxTree.ParseFile(fileName);
        var root = (CompilationUnitSyntax)tree.GetRoot();
        IEnumerable<Roslyn.Compilers.CSharp.SyntaxNode> syntaxNodes;
        syntaxNodes = from methodDeclaration in root.DescendantNodes()
         .Where(x => x is MethodDeclarationSyntax || x is PropertyDeclarationSyntax)
                      select methodDeclaration;
        if (syntaxNodes != null && syntaxNodes.Count() > 0)
        {
            foreach (MemberDeclarationSyntax method in syntaxNodes)
            {
                if (method != null)
                {                       
                    SyntaxTriviaList trivia;
                    if (trivia != null)
                    {
                        if(trivia.Count!=0)
                        {
                            foreach (SyntaxTrivia t in trivia)
                            {
                                if((t.Kind==SyntaxKind.DocumentationCommentTrivia) ||
                                    (t.Kind==SyntaxKind.SingleLineCommentTrivia) ||
                                    (t.Kind==SyntaxKind.MultiLineCommentTrivia))
                                {
                                    MemberDeclarationSyntax newAlterMethod=method.ReplaceTrivia(t, SyntaxTriviaList.Empty);
                                    if (newAlterMethod.ToFullString().ToUpper().Contains("PR_"))
                                    {
                                        methodsInSrceFileContainsProc.Add(newAlterMethod.ToString());
                                    }
                                }
                            }
                        }                        
                        else
                        {                              
                            methodsInSourceFile.Add(method.ToFullString());
                            if (method.ToFullString().ToUpper().Contains("PR_"))
                            {
                                methodsInSrceFileContainsProc.Add(method.ToString());
                            }
                        }                           
                    }            
    
                }
            }
        }
        return string.Empty;
    }
    

推荐答案

我假设您不需要完全限定名称。如果这样做,则必须使用语义模型API,而不是语法API。

若要显示方法的名称,请强制转换为MethodDeclarationSyntax并使用Identifier属性。

若要显示属性的名称,请强制转换为PropertyDeclarationSyntax并使用Identifier属性。

var tree = CSharpSyntaxTree.ParseText(@"
public class Sample
{
    public string FooProperty {get; set;}
   public void FooMethod()
   {
   }
}");

var members = tree.GetRoot().DescendantNodes().OfType<MemberDeclarationSyntax>();

foreach (var member in members)
{
    var property = member as PropertyDeclarationSyntax;
    if (property != null)
        Console.WriteLine("Property: " + property.Identifier);
    var method = member as MethodDeclarationSyntax;
    if (method != null)
        Console.WriteLine("Method: " + method.Identifier);
}

后续问题是"为什么MemberDeclarationSynTax没有Identifier属性?

MemberDeclarationSyntax不仅仅是方法和属性的基类。特别是,它是BaseFieldDeclarationSyntax的基类。字段声明并不总是有明确的标识符。

例如,以下字段的标识符应该是什么?它有两个名称。

class Sample
{
    private string fieldOne, fieldTwo;
}

希望这能为您澄清这一点。

这篇关于如何使用Roslyn获得方法定义?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆