我有一组方法允许用户轻松使用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);
答案 0 :(得分:3)
首先,这是不覆盖 - 这是重载。
从方法声明的角度来看很好 - 我怀疑它是调用站点是不明确的。不幸的是,你没有向我们展示任何这些。
我个人会在这里使用两个不同的名字来保持简单。 Overloading can be a complex business,当你有代表参与时(使用匿名函数,方法组转换等),它甚至比正常情况更糟糕 - 可选参数也增加了复杂性!拥有不同名称的方法可以使更多更清晰。
或者,你需要重载它吗?难道你不能只拥有Action<T, T>
的版本,并且在你不关心它时只是忽略回调中的“旧”值吗?这会简化事情。