2013-12-14 23 views
2

我首先會顯示一個完全正常的同類不使用表達式樹:如何使用閉包對象作爲參數來創建調用(或與之結合)另一個表達式的表達式?

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

使用表達式樹時,我該如何實現這個等價?如果我需要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); 
    } 
} 

回答

1
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); 
} 
+0

非常感謝!我看着Expression.Invoke,但我沒有考慮Expression.Constant(因爲它不是一個常量,至少不是從C#的角度來看)。你碰巧知道一本關於表達樹的更好的書或鏈接? – lightbricko

相關問題