このコードを検討する:
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
同じ2つの式に変換できますか。のそれぞれを評価するだけではなく、2つの新しい式を取得することに注意してください。exp1
exp2
exp0
Foo
foos
[更新]:
基本的に、これらの列挙は静的であり、そうでない式を読み取るコードをすでに持っているため、Linq
拡張メソッドに渡された式を、列挙内のアイテムごとに1つの式に拡張または「フラット化」できるようにしたいです。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)"