Учитывая этот код:
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)"