Teniendo en cuenta este código:Reemplazar parámetro en la expresión lambda
public class Foo
{
public int a { get; set; }
public int b { get; set; }
}
private void Test()
{
List<Foo> foos = new List<Foo>();
foos.Add(new Foo());
foos.Add(new Foo());
Expression<Func<Foo, int>> exp0 = f => f.a * f.b;
Expression<Func<int>> exp1 =() => foos[0].a * foos[0].b;
Expression<Func<int>> exp2 =() => foos[1].a * foos[1].b;
}
¿Cómo se puede tomar exp0
y convertirla en dos expresiones idénticas a exp1
y exp2
. Tenga en cuenta que no quiero simplemente evaluar exp0
para cada Foo
en foos
, sino que en cambio obtener dos expresiones nuevas.
[Actualización]:
Básicamente, quiero ser capaz de expandirse o "aplanar" una expresión pasó a un método Linq
extensión, como Sum
en una expresión por cada elemento de la enumeración ya que estas enumeraciones se ser estático, y porque ya tengo un código que lee expresiones que no toman parámetros (y luego los convierte en otro idioma).
estoy usando el MetadataToken
como referencias a las propiedades que tienen un determinado atributo (en este caso a
y b
tendría este atributo) y usarlo con un diccionario que se correlaciona C# propiedades de las variables de otro idioma:
Foo foo = new Foo();
Expression<Func<int>> exp =() => foo.a * foo.a + foo.b;
string result1 = GetResult(exp); // gets "v_001 * v_001 + v_002"
List<Foo> foes = new List<Foo>();
foes.Add(new Foo());
foes.Add(new Foo());
Expression<Func<int>> exp2 =() => foes.Sum(f => f.a * f.a + f.b);
string result2 = GetResult(exp2); // should get "(v_001 * v_001 + v_002) + (v_003 * v_003 + v_004)"
Puede darnos una ejemplo de cómo usarías esto y cuál sería el resultado? –
Ver también http://stackoverflow.com/questions/5631070/currying-expressions-in-c-sharp – AakashM