如何使用Roslyn获取方法定义?

问题描述 投票:4回答:2
  1. 如何从MemberDeclarationSyntax对象单独获取方法声明?
  2. 如何用空的方法定义替换单行和多行注释。 我们可以使用SyntaxTriviaList执行此操作。 这里我没有为SyntaxTriviaList分配任何对象。我们有什么方法吗? 从身体的定义获得琐事信息。
  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; }
c# roslyn
2个回答
9
投票

我假设你不需要完全限定的名字。如果这样做,您将不得不使用SemanticModel 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;
}

希望这能为你清除它。


0
投票
var body = member.Body.ToString();

var fullMethodName = member.ToString().Replace(body, "");
© www.soinside.com 2019 - 2024. All rights reserved.