【问题标题】:How to chain method overloads that accept Func<> delegates ? (C#)如何链接接受 Func<> 委托的方法重载? (C#)
【发布时间】:2010-10-20 15:05:53
【问题描述】:

我有一个方法有两个重载,如下:

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

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

非常感谢您的建议,

提姆

【问题讨论】:

    标签: c# generics delegates predicate


    【解决方案1】:

    试试这个(你不需要打电话给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。
    • 感谢大家快速而简洁的回复。事实上,所有这些答案都可以解决我的问题,但我只能选择一个。
    【解决方案2】:

    类似这样的:

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

    【讨论】:

    • 哎呀,最后忘记了错误。 Philip Rieck 就是这样,但反过来 :)。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      除非您要“组成”要传递的值,否则您的第一个重载不能调用第二个。不过,您的第二个可以轻松调用第一个。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多