2011-01-10 7 views

答えて

2
public class Foo 
{ 
    public Bar Bar { get; set; } 
} 

public class Bar 
{ 
    public string Fizz { get; set; } 
} 

private Expression<Func<Bar, bool>> BarExp() 
{ 
    return b => b.Fizz == "fizz"; 
} 

private Expression<Func<Foo, bool>> BarToFoo(Expression<Func<Bar, bool>> barExp) 
{ 
    Expression<Func<Foo, Bar>> barMemberAccessExpression = foo => foo.Bar; 

    var fooParam = Expression.Parameter(typeof(Foo), "foo"); 

    var invokeExpression = Expression.Invoke(
     barExp, 
     Expression.Invoke(barMemberAccessExpression, fooParam) 
     ); 

    var result = Expression.Lambda<Func<Foo, bool>>(invokeExpression, fooParam); 

    return result; 

    //Expression<Func<Foo, bool>> result = 
    // foo => barExp.Compile().Invoke(foo.Bar); 

    //return result; 
} 

[Test] 
public void TestBarToFoo() 
{ 
    var fooInstance = new Foo { Bar = new Bar() { Fizz = "fizz" } }; 

    var barExpr = this.BarExp(); 

    Console.WriteLine(
     barExpr.Compile().Invoke(fooInstance.Bar)); // = True 

    Console.WriteLine(
     this.BarToFoo(barExpr).Compile().Invoke(fooInstance)); // = True 
} 
+0

w/oコンパイルしないでください。 –

+0

コンパイルなし:私の編集を参照してください... btw:素敵な質問。 – ulrichb

+0

'Assert.Equal(expectedExp()、BarToFoo(barExpr));' == '期待:f =>(f.Bar.Fizz ==" fizz ");実際:foo =>呼び出し(b =>(b.Fizz == "fizz")、呼び出し(foo => foo.Bar、foo)) '。実際に私が探しているものではありません(それはもはや必要ありませんが、とにかくこれを理解するのは楽しいでしょう)。 –

関連する問題