Заменить параметр в лямбда-выражении

Учитывая этот код:

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;
}

Как можно взять exp0и превратить его в два выражения, идентичные exp1и exp2. Обратите внимание, что я не хочу просто вычислять exp0для каждого Fooв foos, а вместо этого получаю два новых выражения.

[Обновление]:

По сути, я хочу иметь возможность расширить или «сгладить» выражение, переданное методу расширения Linq, такому как Sum, в одно выражение для каждого элемента в перечислении, поскольку эти перечисления будут статическими, и поскольку у меня уже есть код, который читает выражения, не принимающие параметров (, а затем преобразует их в другой язык ).

Я использую MetadataTokenкак ссылку на свойства, которые имеют определенный атрибут (, в этом случае aи bбудут иметь этот атрибут )и использовать его со словарем, который коррелирует C #свойства переменных другого языка:

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)"
11
задан Ani 22 June 2012 в 16:31
поделиться