Linq表达式的转换

3

我不确定如何准确地表达我想要实现的目标,因此 - 编写了一些代码:

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); //<-------------------------------------------???
 }          
}

这真的可能吗?

1个回答

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
}

Assert.Equal(expectedExp(),BarToFoo(barExpr)); == 期望值: f => (f.Bar.Fizz=="fizz"); 实际值: foo=>Invoke(b=>(b.Fizz=="fizz"), Invoke(foo=>foo.Bar, foo))。这并不是我要找的(我不再需要它,但尝试解决这个问题仍然很有趣)。 - Arnis Lapsa
表达式Equals()不进行深度比较。因此,即使您复制了方法ExpectedExp()并创建了ExpectedExp2(),您也不会得到绿色的Assert.Equal(ExpectedExp(),ExpectedExp2()); - ulrichb
非常好。表达式可能会让人倍感困难。在没有编译的情况下,看起来你做得很好。加一! - Enigmativity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接