gpt4 book ai didi

c# - Linq 表达式的转换

转载 作者:行者123 更新时间:2023-11-30 17:19:44 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com