Как связать перегрузки методов, которые принимают делегаты Func <>?(С #) - PullRequest
1 голос
/ 20 октября 2010

У меня есть метод с двумя перегрузками, как показано ниже:

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 ]

6 голосов
/ 20 октября 2010

Попробуйте (вам не нужно звонить 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 голос
/ 20 октября 2010

Самый простой способ - обернуть исходный делегат без параметров тем, который принимает и игнорирует один параметр.

bool Evaluate(Func<bool> condition) 
{ 
    return Evaluate( _ => condition(), 0); 
} 
1 голос
/ 20 октября 2010

Ваша первая перегрузка не может вызвать вторую, если вы не собираетесь «составлять» значение для передачи. Впрочем, ваш второй может легко позвонить первому.

bool Evaluate<T>(Func<T, bool> condition, T value)
{
   return Evaluate( () => condition(value));
}
1 голос
/ 20 октября 2010

Примерно так:

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