如何使用Roslyn获得方法定义? [英] How to get method definition using Roslyn?
本文介绍了如何使用Roslyn获得方法定义?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何从MemberDeclarationSynTax对象单独获取方法声明?
如何将方法定义中的单行和多行注释替换为空。
我们可以使用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;
}
希望这能为您澄清这一点。
这篇关于如何使用Roslyn获得方法定义?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文