をパラメータに置き換えます。は、このコードを考慮すると、ラムダ式で
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
と同一の二つの式に変換することができます。各Foo
のexp0
をfoos
に評価するのではなく、2つの新しい式が得られることに注意してください。
[更新]:
基本的に、私はこれらの列挙ので、このような列挙内の項目ごとに1式にSum
としてLinq
拡張メソッドに渡された式を展開または「フラット化」することができるようになるでしょう私はすでにパラメータを取っていない式を読み込んで、別の言語に変換するコードを持っているからです。
a
と
b
は、この属性を持っているでしょう)、特定の属性を持つプロパティへの参照として
MetadataToken
を使用し、別の言語の変数に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)"
あなたが私たちに与えることはできますが、どのようにこれを使用し、出力はどのようになるのかの例は? –
も参照してくださいhttp://stackoverflow.com/questions/5631070/currying-expressions-in-c-sharp – AakashM