2011-01-10 3 views
3

Ich bin nicht sicher, wie genau Argument, was ich versuche also zu erreichen, - schrieb einigen Code:Umwandlung von Linq-Ausdrücke

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

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

public class Facts{ 
[Fact] 
public void fact(){ 
    Assert.Equal(expectedExp(),barToFoo(barExp())); 
} 
private Expression<Func<Foo,bool>> expectedExp(){ 
    return f=>f.Bar.Fizz=="fizz"; 
} 
private Expression<Func<Bar,bool>> barExp(){ 
    return b=>b.Fizz=="fizz"; 
} 
private Expression<Func<Foo,bool>> barToFoo 
    (Expression<Func<Bar,bool>> barExp){ 
    return Voodoo(barExp); //<-------------------------------------------??? 
}   
} 

Ist das überhaupt möglich?

Antwort

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

Und ohne kompilieren? –

+0

w/o kompilieren: siehe meine Bearbeitung, ... BTW: nette Frage. – ulrichb

+0

'Assert.Equal (expectedExp(), BarToFoo (barExpr));' == 'Erwartet: f => (f.Bar.Fizz ==" fizz "); Actual: foo => Aufrufen (b => (b.Fizz == "fizz"), Aufrufen (foo => foo.Bar, foo)) '. Nicht wirklich, wonach ich suche (brauche es nicht mehr, aber es würde mir Spaß machen, das herauszufinden). –