2011-08-31 51 views
7

是否可以使用自己的定義擴展Linq的查詢關鍵字(如:select,where等)?是否可以在C#/ LINQ中擴展查詢關鍵字?

Codeexample這樣可以很清楚:

System.Collections.Generic.List<string> aList = 
    new System.Collections.Generic.List<string> { "aa", "ab", "ba", "bb" }; 

// instead of 
string firstString = (from item in aList 
         where item.StartsWith("a") 
         select item).First(); 

// would be nice 
string firstString = from item in aList 
        where item.StartsWith("a") 
        selectFirst item; 

// or something else 
from item in aList 
where item.StartsWith("a") 
WriteLineToConsole item; 

我認爲這是不可能的,但仍然希望;)來實現,這將是寫一個預處理器,這將改變您的自定義

+0

任何特定的原因,你爲什麼要這樣做? – AakashM

+0

三位400K +用戶回答了你的問題。去吧,宰一隻山羊! – dotNET

回答

6

的一種方式在將LINQ關鍵字提供給編譯器之前,將它們轉換爲標準LINQ關鍵字。順便說一下,它是如何與標準的LINQ關鍵字一起工作的。預處理器將它們轉換爲正常的擴展方法(.Select,.Where,.GroupBy,...),然後將其提供給不理解這些關鍵字的編譯器。

當然,通過這樣做,您將失去Intellisense,但這可以通過編寫Visual Studio擴展來解決。雖然對於這種糖來說可能有很多工作。

+1

你能爲這個擴展提供一些起點嗎? – Matthias

+0

知道這是一個非常古老的問題,但你有沒有設法做一些關於自定義關鍵字? –

4

不,這是不可能的語言規範或任何當前C#編譯器內。你在那裏創建的任何東西都不再是(純粹的)C#。

6

您不能添加您自己的上下文關鍵字,但您可以影響現有的關鍵字。

例如,下面的代碼:

string firstString = (from item in aList 
         where item.StartsWith("a") 
         select item).First(); 

有效預處理到:

string firstString = aList.Where(item => item.StartsWith("a")) 
          .First(); 

...所以,如果你改變什麼的WhereFirst方法調用的意思是,你可以影響行爲。

如果你有這個想法,你可能想看看this Stack Overflow answer,我前一段時間寫了一些改變在某些情況下LINQ to Entities中的where的行爲。這是邪惡的,但邪惡的代碼。