我们可以使用SyntaxTriviaList做到这一点吗?
在这里,我没有将任何对象分配给SyntaxTriviaList。我们有什么方法可以
从 body 的定义中获取琐事信息。
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而不是语法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/