2013-07-02 38 views
3

我有一個代碼:屬性,方法,拉姆達代碼中使用表情

using System.Linq.Expressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Expression<del> myET = x => x.Age; //for example in ASP.NET MVC forms 
      Person.Name = "vitia" 
      Person.Move(); 

     } 
    } 
} 

我想知道如何使用Roslyn.NET可以「拉」和寫入到控制檯中的所有方法,屬性和代碼中使用的lambda。現在我坐在這上好幾個小時,我想不出什麼。我試圖在這裏使用MemberAccesExpressionSyntax,但我並沒有真正出現。你能舉出一些例子嗎?有了這個代碼,屏幕上會放控制檯:

x.Age 名稱 移動

+0

請仔細閱讀http://blog.stackoverflow.com/2009/07/non-english-question-policy/ –

+0

對不起!已經糾正! – sangui

回答

2

這是哪門子查詢,你正在尋找:

var expressionNodes = syntaxTree. 
    GetRoot(). 
    DescendantNodes().Where(n => n.Kind == SyntaxKind.[YourSyntaxKind]); 

下面是代碼的完整示例。你應該能夠將它粘貼到你的C#控制檯應用程序中。

我掏出:

  • Parentesised Lambda表達式
  • 簡單的Lambda表達式
  • 方法

我將離開作爲一個鍛鍊; Tibial爲自己拉出來的東西你休息需要。

private static void StackOverflowTest() 
{ 
    var syntaxTree = SyntaxTree.ParseText(@" 
    using System.Linq.Expressions; 

    namespace ConsoleApplication1 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       Expression<del> myET = x => x.Age; //for example in ASP.NET MVC forms 
       Person.Name = ""vitia"" 
       Person.Move(); 

      } 
     } 
    }"); 

    EmitStatement(syntaxTree, SyntaxKind.ParenthesizedLambdaExpression); 
    EmitStatement(syntaxTree, SyntaxKind.SimpleLambdaExpression); 
    EmitStatement(syntaxTree, SyntaxKind.MethodDeclaration); 
} 

private static void EmitStatement(SyntaxTree syntaxTree, SyntaxKind sk) 
{ 
    var expressionNodes = syntaxTree. 
     GetRoot(). 
     DescendantNodes().Where(n => n.Kind == sk); 

    foreach (var expressionNode in expressionNodes) 
    { 
     Console.WriteLine(expressionNode.ToString()); 
    } 
}