考虑以下代码:
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
相同的表达式。请注意,我不想对每个foos
中的Foo
计算exp0
,而是要获得两个新表达式。[更新]:
基本上,我想能够将传递给
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)"