C# 如何使用闭包对象作为参数创建调用(或与)另一个表达式的表达式?
我将首先展示一个不使用表达式树的完全工作的等价物:C# 如何使用闭包对象作为参数创建调用(或与)另一个表达式的表达式?,c#,linq,expression-trees,C#,Linq,Expression Trees,我将首先展示一个不使用表达式树的完全工作的等价物: public class ClassUsingFuncs { public SomeClass SomeProperty { get; set; } public void DoSomethingUsingFuncWithoutArgument(Func<bool> funcWithoutArgument) { } public void DoSomethingUsingFuncWithA
public class ClassUsingFuncs
{
public SomeClass SomeProperty { get; set; }
public void DoSomethingUsingFuncWithoutArgument(Func<bool> funcWithoutArgument)
{
}
public void DoSomethingUsingFuncWithArgument(Func<SomeClass, bool> funcWithArgument)
{
Func<bool> funcWithoutArgument = () => funcWithArgument(SomeProperty);
DoSomethingUsingFuncWithoutArgument(funcWithoutArgument);
}
}
public类使用funcs
{
公共SomeClass SomeProperty{get;set;}
public void doSomethingSingFuncWithout参数(Func funcWithout参数)
{
}
public void doSomethingSingFuncWithArgument(Func funcWithArgument)
{
Func funcWithoutArgument=()=>funcWithArgument(SomeProperty);
doSomethingSingFuncWithoutArgument(funcWithoutArgument);
}
}
在使用表达式树时,如何实现这方面的等效性?如果我需要LINQKit或其他库来实现这一点,这没有问题
public class ClassUsingExpressionTrees
{
public SomeClass SomeProperty { get; set; }
public void DoSomethingUsingExpressionWithoutArgument(Expression<Func<bool>> expressionWithoutArgument)
{
}
public void DoSomethingUsingExpressionWithArgument(Expression<Func<SomeClass, bool>> expressionWithArgument)
{
Expression<Func<bool>> expressionWithoutArgument = ?
DoSomethingUsingExpressionWithoutArgument(expressionWithoutArgument);
}
}
公共类使用ExpressionContrees
{
公共SomeClass SomeProperty{get;set;}
public void doSomethingSingExpression无参数(表达式表达式无参数)
{
}
public void doSomethingSingExpressionWithArgument(表达式expressionWithArgument)
{
表达式expressionWithoutArgument=?
doSomethingSingExpressionwithoutargument(expressionWithoutArgument);
}
}
公共void doSomethingSingExpressionWithArgument(Expression Expression WithArgument)
{
var thisExpr=表达式常数(this);
var pExpr=Expression.Property(thisExpr,“SomeProperty”);
var invokeExpr=Expression.Invoke(expressionWithArgument,pExpr);
Expression expressionWithoutArgument=Expression.Lambda(invokeExpr);
doSomethingSingExpressionwithoutargument(expressionWithoutArgument);
}
非常感谢!我看了表达。调用,但我没有考虑表达式。常数(因为它不是一个常数,至少不是从C的角度)。你知道一本好书或是一个链接可以让你了解更多关于表达式树的知识吗?
public void DoSomethingUsingExpressionWithArgument(Expression<Func<SomeClass, bool>> expressionWithArgument)
{
var thisExpr = Expression.Constant(this);
var pExpr = Expression.Property(thisExpr, "SomeProperty");
var invokeExpr = Expression.Invoke(expressionWithArgument, pExpr);
Expression<Func<bool>> expressionWithoutArgument = Expression.Lambda<Func<bool>>(invokeExpr);
DoSomethingUsingExpressionWithoutArgument(expressionWithoutArgument);
}