Pergunta

O que é exatamente Expression <> usado para em C #? Existem quaisquer cenários onde você iria instanciar Expression <> 's-se como um objeto? Se assim for, por favor, dê um exemplo!

Obrigado!

Foi útil?

Solução

Expression<T> é quase totalmente utilizado para LINQ, mas isso não acontece Have para ser. Dentro LINQ, geralmente é usada para "capturar" a lógica expressa em código, mas mantê-lo em dados. Que os dados podem então ser analisados ??pelo provedor LINQ e tratado de forma adequada - por exemplo, convertendo-a em SQL. Normalmente, as árvores de expressão em LINQ são criados pelo compilador de expressões lambda ou expressões de consulta -. Mas em outros casos, pode ser útil para usar a API diretamente yourself

Alguns exemplos de outros lugares que eu usei-o e vi sendo utilizado:

  • Na MiscUtil , Marc Gravell usou para implementar "aritmética genérico" - se um tipo tem o operador relevante, ele pode ser usado genericamente.
  • Na UnconstrainedMelody eu usei-o em uma maneira similar para executar operações em bandeiras enums, independentemente de seu tipo subjacente (que é mais complicado do que se poderia esperar, devido à long e ulong ter várias categorias)
  • Na Visual LINQ eu usei expressões de consulta para LINQ "animado", para que possa ver o que está acontecendo. Embora, obviamente, este é um uso LINQ, não é a forma tradicional de traduzir a lógica em outra forma.

Outras dicas

Em termos de LINQ, há coisas que você pode fazer para criar mais versátil consultas LINQ em tempo de execução do que você pode puramente em lambdas.

Eu usei Expression muitas vezes como um micro-compilador, como uma alternativa para DynamicMethod e IL. Esta abordagem fica mais forte no .NET 4.0 ( como discutido na InfoQ ), mas mesmo em 3,5 existem muitos de coisas que você pode fazer (geralmente baseado em dados de tempo de execução; configuração etc):

Eu também usado como parte de um mecanismo de matemática por algum trabalho que eu fiz com a Microsoft - ou seja, analisar uma expressão matemática ( "(x + 12) * y = z" etc) em uma árvore Expression, compilá-lo e executá-lo .

Outro uso intersting (ilustrado por Jason Bock, aqui ) é em programação genética; construir seus candidatos como árvores Expression, e você tem o código necessário para executá-los rapidamente (depois Compile()), mas o mais importante (para programação genética), também a fragmentos de swap redor.

Dê uma olhada no meu antes e depois do código em minha resposta a outra questão SO .

Resumo:. Expression<> muito simplificada do código, tornou mais fácil de entender, e até mesmo corrigido um bug phantom

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top