c# - Linq 表达式的转换

标签 c# linq linq-expressions

我不确定我想要实现的目标到底是如何争论的,因此 - 写了一些代码:

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

这可能吗?

最佳答案

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
}

关于c# - Linq 表达式的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4646374/

相关文章:

c# - 具有显式泛型类型行为的奇怪泛型方法调用

C# 在 winforms 上验证文本框的输入

c# - 如何在 C# 中构建不区分大小写的强类型 LINQ 查询?

c# - 使用串联构建 lambda 表达式

linq - 扩展方法转换为 LINQ 表达式和常用方法

c# - 如何在 C# 和 Npgsql 中使用不带双引号的 PostgreSQL 表名

c# - 几分钟后 Web api 不记名 token 超时

c# - 如何优化linq中的FirstOrDefault语句

linq - 在任何情况下,LINQ 的 .Where() 会比 O(N) 快吗?