2

我有一组方法允许用户轻松使用 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);
4

1 回答 1

3

首先,这不是压倒一切 - 这是重载

从方法声明的角度来看,这很好——我怀疑这是模棱两可的调用站点。不幸的是,您没有向我们展示任何这些。

就个人而言,我会在这里使用两个不同的名称以使事情更简单。重载可能是一项复杂的业务,当您涉及委托(使用匿名函数、方法组转换等)时,它甚至比正常情况更糟——可选参数也增加了复杂性!使用不同名称的方法可以使事情更加清晰。

或者,您是否需要重载它?Action<T, T>当您不关心回调时,您不能只拥有带有的版本并忽略回调中的“旧”值吗?那会简化事情。

于 2012-02-29T18:32:14.690 回答