2012-01-12 104 views
2

我有兩個表達式:C#如何將兩個表達式合併爲一個新表達式?

public static Expression<Func<int, bool>> IsDivisibleByFive() { 
    return (x) => x % 5 == 0; 
} 

public static Expression<Func<int, bool>> StartsWithOne() { 
    return (x) => x.ToString().StartsWith("1"); 
} 

我想創建一個同時適用於這兩個新的表達式(同樣的表達式用遍了我在不同的組合代碼):

public static Expression<Func<int, bool>> IsValidExpression() { 
    return (x) => IsDivisibleByFive(x) && StartsWithOne(x); 
} 

然後做:

public static class IntegerExtensions 
{ 
    public static bool IsValid(this int self) 
    { 
     return IsValidExpression().Compile()(self); 
    } 
} 

而且在我的代碼:

if (32.IsValid()) { 
    //do something 
} 

我有我想要定義的一次,而不是重複碼所有的地方很多這樣的表情。

謝謝。

+4

問題是什麼? – 2012-01-12 19:30:04

+2

爲什麼你首先使用表達式而不僅僅是代表? – svick 2012-01-12 19:33:42

+0

增加了更多細節,但基本上我的第三個代碼塊實際上並沒有工作,這是'理論上我希望我能做到的事情'。現在,我必須手動創建一個新方法來返回一個表達式,這是前兩個的組合,然後我必須在我的代碼庫中分別維護這兩個表達式。 – 2012-01-12 19:33:54

回答

6

如果您嘗試將表達式實體與AndAlso表達式結合使用,則會遇到的問題是x參數表達式實際上是兩個不同的參數(即使它們具有相同的名稱)。爲了做到這一點,您需要使用表達式樹狀訪問者來替換要與單個常見的​​合併的兩個表達式中的x

你可能想看看Joe Albahari's PredicateBuilder library,它爲你做了繁重的工作。結果應該如下所示:

public static Expression<Func<int, bool>> IsValidExpression() { 
    return IsDivisibleByFive().And(StartsWithOne()); 
} 
+0

正是我在找的東西。謝謝 – 2012-01-12 22:59:03