2011-08-31 6 views
7

¿es posible extender las palabras clave de consulta de Linq (como: seleccionar, dónde, etc.) con definiciones propias?¿Es posible extender las palabras clave de consulta en C#/LINQ?

Codeexample para que sea más claro:

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; 

Creo que no es posible, pero todavía con la esperanza;)

+0

¿Alguna razón en particular por la cual le gustaría hacer esto? – AakashM

+0

Tres usuarios de 400K + respondieron tu pregunta. Ve, mata una cabra! – dotNET

Respuesta

6

Una forma de lograr esto sería escribir un pre-procesador que va a transformar su encargo Las palabras clave LINQ en palabras clave LINQ estándar antes de alimentarlo al compilador. Por cierto, así es como funciona con las palabras clave estándar de LINQ. Un preprocesador los convierte en métodos de extensión normales (.Select, .Where, .GroupBy, ...) y luego los envía al compilador que no los entiende.

Por supuesto, al hacerlo perderá Intellisense, pero esto podría resolverse escribiendo una extensión de Visual Studio. Sin embargo, podría ser bastante trabajo para este azúcar.

+1

¿Puede proporcionar algunos puntos de inicio para estas extensiones? – Matthias

+0

Sepa que es una pregunta muy antigua, pero ¿ha logrado hacer algo con las palabras clave personalizadas? –

4

No, no es posible dentro de la especificación de idioma o cualquier compilador de C# actual. Todo lo que crees allí ya no será (puro) C#.

6

No puede agregar sus propias palabras clave contextuales, pero puede afectar lo que significan las existentes.

Por ejemplo, este código:

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

es preprocesado con eficacia a:

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

... lo que si cambia lo que significan esas Where y First llamadas de método, puede afectar el comportamiento .

Si tiene el estómago para ello, es posible que desee mirar this Stack Overflow answer que escribí hace un tiempo que cambia el comportamiento de where en LINQ a entidades en ciertas circunstancias. Sin embargo, es un código malvado y malvado.

Cuestiones relacionadas