我有一组方法,允许用户轻松使用 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);
最佳答案
首先,这不是重写 - 这是重载。
从方法声明的角度来看,这很好 - 我怀疑这是不明确的调用站点。不幸的是,您还没有向我们展示其中任何一个。
就我个人而言,我会在这里使用两个不同的名称以使事情更简单。 Overloading can be a complex business ,当您涉及委托(delegate)(使用匿名函数、方法组转换等)时,情况甚至比正常情况更糟糕 - 并且可选参数也增加了复杂性!使用不同名称的方法可以让事情变得更加清晰。
或者,您是否需要重载它?难道你不能只拥有带有 Action<T, T>
的版本吗?当您不关心它时,就忽略回调中的“旧”值?这会让事情变得简单。
关于c# - 使用操作作为参数覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504584/