如何从MemberDeclarationSyntax对象中单独获取方法声明?如何使用Roslyn获取方法定义?
如何使用空白替换方法定义中的单行和多行注释。
我们可以使用SyntaxTriviaList来做到这一点。
这里我没有分配任何对象到SyntaxTriviaList。我们是否有任何方法可以从身体的定义中获得琐事信息。
如何单独获取方法名称。
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; }
3
A
回答
5
我假设你不需要完全合格的名称。如果这样做,则必须使用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;
}
希望这可以帮你清除它。
相关问题
- 1. 使用Roslyn获取方法的实现
- 2. 如何获取使用Roslyn的方法调用/类声明的全名路径
- 3. 使用roslyn api获取所有类型的扩展方法
- 4. Roslyn:如何使用Roslyn C获得DeclarationSyntax的命名空间#
- 5. 如何用roslyn获得一个方法体的il?
- 6. 如何使用Roslyn获取编译时间常量值
- 7. 如何使用roslyn获取项目的默认名称空间?
- 8. 如何使用Javassist获取方法体?
- 9. 获取错误,该方法未定义
- 10. 获取未定义的方法content_for()
- 11. 获取定义方法的类
- 12. 如何从方法体获取定义类?
- 13. 如何获取方法定义中的名称或参数?
- 14. 如何根据webservice url获取定义的方法
- 15. Android:如何从自定义方法获取回调?
- 16. Roslyn在ObjectCreationExpressionSyntax中获取IdentifierName
- 17. 如何使用定义的方法,另一种方法
- 18. 为自定义attr_accessor获取未定义的方法`validates_presence_of'
- 19. 修改Roslyn的方法体
- 20. 获取“无法读取属性'[方法]'未定义”
- 21. 如何获取findElementById方法?
- 22. 如何创建通用获取自定义WebConfig段扩建方法
- 23. 使用toastr获取'无法读取属性',然后'未定义'
- 24. Java - 如何获取类调用方法
- 25. 如何在使用Roslyn C#语法工厂时转义变量名?
- 26. 我可以在定义的解决方案中使用roslyn分析仪吗?
- 27. 为Roslyn提供某种特定方法的调用者信息
- 28. 无法通过自定义方法从UITableViewCell获取值
- 29. 如何使用Roslyn修改源代码?
- 30. 如何在osx中使用Roslyn?
另外,构造函数,析构函数等 – 2014-10-18 22:32:37