2014-10-18 48 views
3
  1. 如何从MemberDeclarationSyntax对象中单独获取方法声明?如何使用Roslyn获取方法定义?

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

回答

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

另外,构造函数,析构函数等 – 2014-10-18 22:32:37

相关问题