用操作作为参数重写方法
本文关键字:重写 方法 参数 操作 作作 | 更新日期: 2023-09-27 18:26:24
我有一组方法,允许用户轻松使用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);
首先,这是而不是重写-这是重载。
从方法声明的角度来看,这很好——我怀疑是调用站点不明确。不幸的是,你没有给我们看这些。
就我个人而言,我会在这里使用两个不同的名字来简化事情。重载可能是一项复杂的业务,当您有委托参与时(使用匿名函数、方法组转换等),它甚至比正常情况更糟糕——可选参数也增加了复杂性!使用不同名称的方法可以使更加清晰。
或者,你需要让它过载吗?难道你不能只拥有带有Action<T, T>
的版本,而忽略回调中的"旧"值吗?这会简化事情。