Domanda

Che cos'è esattamente Expression < > usato per in C #? Ci sono scenari in cui potresti istanziare Expression < > te stesso come oggetto? Se è così, per favore fai un esempio!

Grazie!

È stato utile?

Soluzione

Expression < T > è quasi interamente utilizzato per LINQ, ma non deve essere. All'interno di LINQ, viene solitamente utilizzato per "acquisire". la logica espressa in codice, ma tenerlo nei dati. Tali dati possono quindi essere esaminati dal fornitore LINQ e gestiti in modo appropriato - ad es. convertendolo in SQL. Di solito gli alberi delle espressioni in LINQ sono creati dal compilatore dalle espressioni lambda o dalle espressioni di query, ma in altri casi può essere utile usare l'API direttamente da soli.

Alcuni esempi di altri posti in cui l'ho usato e l'ho visto usato:

  • In MiscUtil , Marc Gravell lo ha utilizzato per implementare "aritmetica generica"; - se un tipo ha l'operatore pertinente, può essere utilizzato genericamente.
  • In UnconstrainedMelody l'ho usato in modo simile per eseguire operazioni su enumerazioni di flag, indipendentemente da del loro tipo di base (che è più complicato di quanto ci si possa aspettare, a causa di long e ulong con intervalli diversi)
  • In Visual LINQ ho usato espressioni di query per " animare " LINQ, così puoi vedere cosa sta succedendo. Mentre ovviamente questo è un utilizzo LINQ, non è la forma tradizionale di tradurre la logica in un'altra forma.

Altri suggerimenti

In termini di LINQ, ci sono cose che puoi fare per creare query LINQ più versatili in fase di esecuzione rispetto a quelle che puoi utilizzare in lambdas.

Ho usato Expression molte volte come micro-compilatore, in alternativa a DynamicMethod e IL. Questo approccio si rafforza in .NET 4.0 ( come discusso su InfoQ ), ma anche in 3.5 ci sono molte di cose che puoi fare (generalmente basate su dati di runtime; configurazione ecc.):

L'ho usato anche come parte di un motore matematico per alcuni lavori che ho fatto con Microsoft, ovvero analizzare un'espressione matematica (" (x + 12) * y = z " etc) in un Expression albero, compilarlo ed eseguirlo.

Un altro uso interessante (illustrato da Jason Bock, qui ) è in programmazione genetica; costruisci i tuoi candidati come alberi Expression e hai il codice necessario per eseguirli rapidamente (dopo Compile () ), ma soprattutto (per la programmazione genetica), anche per scambiare frammenti intorno.

Dai un'occhiata al mio precedente & amp; dopo il codice in la mia risposta a un'altra domanda SO .

Riepilogo: Expression < > ha semplificato notevolmente il codice, reso più semplice la comprensione e persino risolto un bug fantasma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top