使用操作作为参数覆盖方法

时间:2012-02-29 18:26:13

标签: c# propertychanged

我有一组方法允许用户轻松使用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 个答案:

答案 0 :(得分:3)

首先,这是覆盖 - 这是重载

从方法声明的角度来看很好 - 我怀疑它是调用站点是不明确的。不幸的是,你没有向我们展示任何这些。

我个人会在这里使用两个不同的名字来保持简单。 Overloading can be a complex business,当你有代表参与时(使用匿名函数,方法组转换等),它甚至比正常情况更糟糕 - 可选参数也增加了复杂性!拥有不同名称的方法可以使更多更清晰。

或者,你需要重载它吗?难道你不能只拥有Action<T, T>的版本,并且在你不关心它时只是忽略回调中的“旧”值吗?这会简化事情。