如何使用Roslyn获得方法定义?如何使用、定义、方法、Roslyn

由网友(落寞、无法释怀的情感、)分享简介:如何从MemberDeclarationSynTax对象单独获取方法声明?如何将方法定义中的单行和多行注释替换为空。我们可以使用SynaxTriviaList做到这一点吗?在这里,我没有将任何对象分配给SynaxTriviaList。我们有没有办法从身体的定义中获取琐碎信息。如何单独获取方法名称。private...

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

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

ros 话题消息的定义与使用

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

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

如何单独获取方法名称。

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;
}

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

阅读全文

相关推荐

最新文章