C# 以动作作为参数重写方法
我有一组方法,允许用户轻松地使用PropertHasChanged事件,然后允许进行一些额外的处理。方法如下:C# 以动作作为参数重写方法,c#,propertychanged,C#,Propertychanged,我有一组方法,允许用户轻松地使用PropertHasChanged事件,然后允许进行一些额外的处理。方法如下: public virtual void SetPropertyValue<T>(ref T currentValue, T newValue, Action<T> extraFunction = null, Action voidAfterSetAction = null) where T : class { if (cu
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();
}
首先,这不是重写-这是重载
从方法声明的角度来看,这很好——我怀疑是调用站点不明确。不幸的是,你没有给我们看这些
就我个人而言,我会在这里使用两个不同的名称来简化事情,当你让委托参与(匿名函数、方法组转换等)时,它甚至比正常情况更糟糕——可选参数也增加了复杂性!使用不同名称的方法可以让事情更清楚
或者,您是否需要让它过载?难道你不能只使用带有
操作的版本,而忽略回调中的“old”值吗?这将简化事情。我想这是因为动作参数上的默认值为=null。它们是在调用站点设置的,因此可能不明确。@asawyer:可能是。很难说没有看到任何呼叫站点。重载时泛型、委托和可选参数的混合是一个非常讨厌的问题。对不起,我是说重载,我的手指离开了我。我今天打字太多了。正如Jon在下面问的:请告诉我们实际的通话地点,因为这就是问题的原因。您有“许多”错误,因为您多次调用该方法!我更新了。我认为乔恩的建议是正确的(当然)。我只是想更改它的名称。@TheSheekGeek在我看来(可能是不正确的),除了内置的“primitive”类型之外,在任何东西上使用可选参数几乎都不是一个好主意。我对此不确定。一、 我个人没有听说过。不幸的是,我被卡住了,因为它已经在系统中根深蒂固,在我来这里之前就已经存在了。需要进行大量代码更改。@TheSheekGeek,这是您的答案:如果第三个参数为null
,如何在带有Action
参数的版本和带有Action
参数的版本之间进行选择?他们同样优秀!正如你所说,乔恩的建议是正确的:扔掉其中一个过载。
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();
}
SetPropertyValue(ref _streetAddress1, value, null, () => SalesData.StreetAddress1 = value);