2013-01-31 82 views
3

是否有可能利用c#5.0(.Net 4.5)中的dynamic關鍵字創建動態LINQ查詢?本地動態Linq(C#)

我知道這是可能的使用第三方庫,但現在不可行。

來說明我的點的最簡單的方法是通過一個例子:每個請求

class test 
    { 
     public int i { get; set; } 
    } 

    void Foo() 
    { 
     var collection = new[] { new test() { i = 1 }, new test() { i = 2 } }; 
     Bar(collection); 
    } 

    void Bar<T>(IEnumerable<T> collection) 
    { 
     //this works 
     foreach (dynamic item in collection) 
      if (item.i == 2) 
      { 
       //do something 
      } 

     //this does not - although this is what id like to use 
     foreach (dynamic item in collection.Where(a => a.i == 2)) 
     { 
      //do something 
     } 
    } 

編輯:產生一個編譯錯誤 -

「T」不包含「i」的一個定義並且沒有找到接受類型'T'的第一個參數的擴展方法'i'可以找到(您是否缺少使用指令或程序集引用?)

+0

請添加特定的運行時/編譯器錯誤。 – Destrictor

回答

2

將t他T在Bar聲明中使用動態:

void Bar(IEnumerable<dynamic> collection) 
{ 
    //this works 
    foreach (dynamic item in collection) 
     if (item.i == 2) 
     { 
      //do something 
     } 

    //this does compile 
    foreach (dynamic item in collection.Where(a => a.i == 2)) 
    { 
     //do something 
    } 
} 
+0

我很喜歡這個。我還會大膽猜測,並且在與原始的'Bar()' – maxp

+1

比較時,我不知道性能會受到影響,但我真的很討厭編譯時檢查的損失。一定要通過徹底的單元測試來說明這一點。 – mathieu

+0

同意。使用'動態'總是讓我感覺有點骯髒。 – maxp