2011-11-15 56 views
7

我正在尋找將整個方法轉換爲表達式樹的能力。寫出來會很糟糕。 :)尋找C#=> Linq表達式編譯器

因此,考慮以下文本(簡單的例子):

public static int Add(int a, int b) 
{ 
    return a + b; 
} 

我想要麼得到一個內存對象,表示此,或以下文字:

ParameterExpression a = Expression.Parameter(typeof(int), "a"); 
ParameterExpression b = Expression.Parameter(typeof(int), "b"); 
var expectedExpression = Expression.Lambda<Func<int, int, int>>(
     Expression.Add(a,b), 
     a, 
     b 
    ); 

任何想法?有沒有人可以做一些與Roslyn可以做到這一點?

編輯:澄清:我想吮吸任何C#方法(例如,上面的那個)作爲文本,併產生一個結果表達式。基本上我正在尋找編譯任何給定的C#方法到表達式樹中。

回答

8

是羅斯林可以做,但羅斯林都有自己的表達式樹(他們被稱爲語法樹),羅斯林工具允許您加載和執行表達式或語句。

您將不得不編寫自己的語法樹walker來將Roslyn語法樹轉換爲表達式樹,但一切可能不正確。

+0

我想羅斯林可以做到。你知道任何現有的資源已經完成嗎?我正在尋找可用的東西。 – Shlomo

+0

羅斯林只出現一個月,我認爲這需要一段時間,因爲人們會寫和試驗它。但是你可能會在代碼plex上使用諷刺等方式編譯表達式。我認爲有時候人們會在代碼plex上發佈項目給Roslyn,或者你可以啓動一個並請求人們貢獻,並從那裏開始構建。 –

0

表達式樹本身並不是在Expression或lambda表達式之外的其他任何地方生成的(這意味着您的第一個添加語句不能從您的可執行文件中作爲表達式樹來檢索)。但是,您可以在C#代碼(而不是可執行文件)上使用代碼DOM,並從DOM到表達式樹構建一個翻譯器。

+0

完全相反的表達式樹*是*在執行時生成的。當編譯器在目標類型的表達式樹中看到一個lambda表達式時,它會在執行時發出IL來構建一個表達式樹。如問題所示,您也可以編寫C#代碼來構建表達式樹。 –

+0

我很抱歉,因爲我可能錯誤地表達了我想表達的內容。我不排除實際的'表達式'或lambda表達式,但是它們本身就是正則表達式,比如說'var a = 1 + 2;'。這種表述在執行時不是表達式樹的形式。 – doctorless

+0

但是可以將lambda表達式轉換爲表達式樹,以便抽象語法樹在執行時由*表達式樹表示。目前仍不清楚你的意思 - 我建議你編輯你的答案以澄清。 –

1

爲什麼不:

Expression<Func<int,int,int>> expr = (a,b) => a + b; 
+0

我會澄清我的問題。我想要一個可以掃描上述方法文本的函數,並生成構建表達式樹的文本或表達式樹對象本身。 – Shlomo