2012-04-24 77 views
1

我可以很容易地構建任何LINQ表達式,而無需使用Expression工廠方法。例如:大廈LINQ表達式

Func<int, string> f = i => 
{ 
    var result = i.ToString(); 
    //... rest of the code 
    return result; 
}; 

Expression<Func<string>> f2 =() => f(123); 
var s = f2.Compile()(); 

什麼是通過調用工廠方法手動構建表達的優勢在哪裏?

回答

5

例子:

  • 您是基於你不知道提前
  • 正在構建的基於查詢的輸入,即解析字符串"(a.b + c) * 7"
  • 模型的反射構建查詢
  • 您正在撰寫多個表達式到一個單一的表達(訪問者模式,也許)
  • 你是這樣做無法通過lambda表達式來表示有效的東西,即語句機構,成員分配等(這在.NET 4.0中可用,但不是通過l ambda編譯器)
  • 您正在使用沒有lambda編譯器的語言/版本
  • 您希望對lambda構造進行細粒度控制(即,什麼是恆定的,什麼是捕獲等)
  • 你只是想了解它是如何工作的
+0

我正在寫一個表達式解析器。我發現編譯匿名函數比編譯linq表達式要簡單得多。我想知道哪種方式更好,並有更多的應用程序? – 2012-04-24 09:38:36

+0

@mrtofigh如果你正在寫一個*解析器*,那大概是在運行時執行,你必須直接使用'Expression'。如果將它卸載到*編譯器*(或使用'CSharpCodeProvider'),則只能使用lambda表達式。就我個人而言,我可能會在這裏看'ILGenerator',但我有點....挑剔。 – 2012-04-24 09:40:03