Considerando questo codice:Sostituire parametro espressione 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;
}
Come si può prendere exp0
e di trasformarlo in due espressioni identiche a exp1
e exp2
. Si noti che non voglio valutare solo exp0
per ogni Foo
in foos
, ma invece ottenere due nuove espressioni.
[Aggiornamento]:
Fondamentalmente, voglio essere in grado di espandere o "appiattire" espressione passato a un metodo Linq
estensione come Sum
in un'espressione per ogni elemento nell'enumerazione poiché queste enumerazioni volontà essere statico, e perché ho già un codice che legge espressioni che non prendono parametri (e poi li trasforma in un'altra lingua).
sto usando il MetadataToken
come riferimenti a proprietà che hanno un determinato attributo (in questo caso a
e b
avrebbe questo attributo) e usarlo con un dizionario che correla C# oggetti da variabili di un'altra lingua:
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)"
Puoi darci un esempio di come useresti questo e quale sarebbe l'output? –
Vedere anche http://stackoverflow.com/questions/5631070/currying-expressions-in-c-sharp – AakashM