我有一個delegate
如下:如何結合表達式<TDelegate>對象沒有調用?
public delegate TestResult TestCase(byte[] source);
...這裏返回TestResult
如下:
public class TestResult {
public bool Pass { get; }
public int Index { get; }
public TestResult(bool result, int index) {
Pass = result;
Index = index;
}
}
一個例子TestCase
委託的樣子:
public static TestResult In(byte[] tkn, ITestSet testSet) {
return testSet.Contains(tkn);
}
ITestSet
是沒有比封裝的HashSet<byte[]>
多得多。在一個用例中,我有兩個測試集:(1)A - z,(2)0 - 9。我想測試輸入byte[]
是否在任一測試集中。
我正在使用Expression<TestCase>
,但無法解決如何實現Or
測試用例。我有一個TestCaseBuilder
以下方法:
public class TestCaseBuilder {
private Expression<TestCase> tcExpr;
public TestCaseBuilder With(TestCaseBuilder tcBuilder) {
tcExpr = tcBuilder.tcExpr;
return this;
}
public TestCaseBuilder Or(TestCaseBuilder tcBuilder) {
tcExpr = tcExpr.Or(tcBuilder.tcExpr);
return this;
}
}
...和我的擴展方法:
public static Expression<TestCase> Or (this Expression<TestCase> tcLeft, Expression<TestCase> tcRight) {
var lExpr = (LambdaExpression)tcLeft;
var rExpr = (LambdaExpression)tcRight;
var param = lExpr.Parameters;
return Expression.Lambda<TestCase>(/* what to do here ? */, param);
}
Expression.OrElse
機械什麼,我會覺得是適當的,但因爲我返回TestResult
不能使用,而不是bool
。
這裏是如何TestCaseBuilder
用於:
public static TestCase Or(this TestCase tc1, TestCase tc2) {
return tkn => {
var res = tc1(tkn);
if (res.Pass) {
return res;
}
return tc2(tkn);
};
}
我如何可以結合在一個自定義Or
方法2 Expression<TestCase>
無:
testcaseBuilder.As("Foo")
.With(isLetterTestCase)
.Or(isDigitTestCase);
我也只用TestCase
代表進行Or
調用第一個測試用例?
我想你需要一個自定義的ExpressionVisitor,它提供了參數來訪問這兩個表達式,返回一個新的返回一個新的 – pinkfloydx33
@ pinkfloydx33:可能很好......我還沒有使用ExpressionVisitor,有人將能夠提供一個解決方案。這個*測試案例*僅僅是冰山一角。 – IAbstract
寫一個很容易。我一直在用手機,所以很難寫出一個。如果您搜索ParameterReplacer或ExpressionParamaterReplacer,則會顯示一條Marc Gravell的帖子顯示使用情況。 – pinkfloydx33