gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:24:21 24 4
gpt4 key购买 nike

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

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

    我们可以用 SyntaxTriviaList 来做到这一点吗?

    这里我没有为 SyntaxTriviaList 分配任何对象。我们有什么方法吗
    从 body 的定义中获取琐事信息。

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

最佳答案

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

希望这能帮您解决问题。

关于c# - 如何使用 Roslyn 获取方法定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com