Переопределение методов с действиями в качестве параметров - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть набор методов, которые позволяют пользователям легко использовать событие PropertHasChanged, а затем позволяют выполнять дополнительную обработку.Вот метод:

public virtual void SetPropertyValue<T>(ref T currentValue, T newValue, Action<T> extraFunction = null, Action voidAfterSetAction = null) where T : class
        {
            if (currentValue == newValue) return;

            currentValue = newValue;

            PropertyHasChanged();

            if (extraFunction != null) extraFunction(newValue);

            if (voidAfterSetAction != null) voidAfterSetAction();
        }

Мне стало очевидно, что мне иногда нужно старое значение в действии extraFunction.Вот как я намеревался сделать это:

public virtual void SetPropertyValue<T>(ref T currentValue, T newValue, Action<T, T> extraFunction = null, Action voidAfterSetAction = null) where T : class
        {
            var oldVal = currentValue;

            if (currentValue == newValue) return;

            currentValue = newValue;

            PropertyHasChanged();

            if (extraFunction != null) extraFunction(oldVal, newValue);

            if (voidAfterSetAction != null) voidAfterSetAction();
        }

Как вы можете заметить, действие extraFunction теперь принимает два параметра.У VS не было проблемы со мной при создании метода (без красных qwigglies), но при его создании выдается МНОГИЕ ошибки, которые говорят, что использование между первым методом и вторым методом неоднозначно.Если это так, то как мне добиться того, что я ищу?

РЕДАКТИРОВАТЬ

Вот обычное использование метода:

SetPropertyValue(ref _streetAddress1, value, null, () => SalesData.StreetAddress1 = value);

1 Ответ

3 голосов
/ 29 февраля 2012

Во-первых, это не переопределение - это перегрузка .

Это нормально с точки зрения объявлений методов - я подозреваю, что это сайты вызовов , которые неоднозначны. К сожалению, вы не показали нам ничего из этого.

Лично я бы использовал здесь два разных имени, чтобы все было проще. Перегрузка может быть сложным делом , и к тому времени, когда вы задействуете делегатов (с анонимными функциями, преобразованиями групп методов и т. Д.), Это даже хуже, чем обычно - и дополнительные параметры также увеличивают сложность! Наличие методов с разными именами делает вещи намного яснее.

В качестве альтернативы, вам вообще нужно его перегрузить? Разве вы не можете просто иметь версию с Action<T, T> и просто игнорировать «старое» значение в обратном вызове, когда вас это не волнует? Это упростило бы вещи.

...