如何链接接受Func<>的方法重载代表们? (C#)

时间:2010-10-20 15:05:53

标签: c# generics delegates predicate

我有一个带有两个重载的方法,如下所示:

bool Evaluate(Func<bool> condition)
{
    // Some logic

    return condition.Invoke();
}

bool Evaluate<T>(Func<T, bool> condition, T value)
{
    // Same logic as the first method overload

    return condition.Invoke(value);
}

由于两个方法重载都包含大致相同的逻辑,我希望将它们链接在一起,但我看不出如何做到这一点。我想第一个方法overoad需要构造一个委托,它传递给第二个重载,但是不清楚这个委托应采取什么形式。

非常感谢你的建议,

4 个答案:

答案 0 :(得分:6)

试试这个(你不需要拨打Invoke):

bool Evaluate(Func<bool> condition) {
  // logic ...
  return condition();
}

bool Evaluate<T>(Func<T, bool> condition, T value) {
  return Evaluate(() => condition(value));
} 

或许你的逻辑可以重复使用,用它自己的方法提取它可能是有意义的:

bool Evaluate(Func<bool> condition) {
  Logic();
  return condition();
}

bool Evaluate<T>(Func<T, bool> condition, T value) {
  Logic();
  return condition(value);
}

void Logic() {
  // logic...
} 

答案 1 :(得分:1)

这样的事情:

bool Evaluate(Func<bool> condition)
{
    return Evaluate(p => condition.Invoke(), false);
}

答案 2 :(得分:1)

除非您要“弥补”要传递的值,否则您的第一次超载无法调用第二次。不过,你的第二个可以轻松打电话给第一个。

bool Evaluate<T>(Func<T, bool> condition, T value)
{
   return Evaluate( () => condition(value));
}

答案 3 :(得分:1)

最简单的方法是将原始无参数委托包装为接受并忽略单个参数的委托。

bool Evaluate(Func<bool> condition) 
{ 
    return Evaluate( _ => condition(), 0); 
}