2011-08-31 11 views
7

Linqのquery-keywords(select、whereなど)を独自の定義で拡張することは可能ですか?C#/ LINQでQuery-Keywordsを拡張することはできますか?

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

3人の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(); 

が効果的に前処理されています。あなたがそれらWhereFirstメソッド呼び出しが何を意味するか変更するので、もし...

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

、あなたは行動に影響を与えることができます。

胃がある場合は、少し前に書いたthis Stack Overflow answerを見て、特定の状況でLINQの動作をLINQに変更することができます。それは悪い、悪いコードだけど。

関連する問題