Как я могу выделить этот код, чтобы избежать дублирования кода в C #? - PullRequest
0 голосов
/ 22 января 2012

У меня есть следующий код:

private int AllFeb(Forecast f, IRepository repository)
{
    return All(f, repository, f.Feb);
}

private int AllJan(Forecast f, IRepository repository)
{
    return All(f, repository, f.Jan);
}

private int All(Forecast f, IRepository repository, int callBk)
{
    var otherForecasts = repository.Query<Forecast>().Where(r => r.PersonId == f.PersonId);
    if (otherForecasts.Any())
    {
        return otherForecasts.Sum(r => r.Feb) + callBk;
    }
    return 0;
}

Как видите, я пытаюсь придумать общую функцию, которую можно использовать для каждого месяц. Проблема в том, что мне нужна следующая строка в методе All:

otherForecasts.Sum(r => r.Feb)

должно быть общим, но мне нужно, чтобы обратный вызов внутри метода Sum передавался извне (поскольку я не хочу, чтобы он был жестко закодирован как r.Feb.

Есть ли способ избежать дублирования кода здесь?

1 Ответ

3 голосов
/ 22 января 2012

Передайте Expression<Func<Forecast, int>> в метод All ().

private int AllFeb(Forecast f, IRepository repository)
{
    return All(f, repository, f.Feb, r => r.Feb);
}

private int AllJan(Forecast f, IRepository repository)
{
    return All(f, repository, f.Jan, r => r.Jan);
}

private int All(Forecast f, IRepository repository, int callBk, Expression<Func<Forecast, int>> projection)
{
    var otherForecasts = repository.Query<Forecast>().Where(r => r.PersonId == f.PersonId);
    if (otherForecasts.Any())
    {
        return otherForecasts.Sum(projection) + callBk;
    }
    return 0;
}
...