Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以动作作为参数重写方法_C#_Propertychanged - Fatal编程技术网

C# 以动作作为参数重写方法

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

我有一组方法,允许用户轻松地使用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();
        }
首先,这不是重写-这是重载

从方法声明的角度来看,这很好——我怀疑是调用站点不明确。不幸的是,你没有给我们看这些

就我个人而言,我会在这里使用两个不同的名称来简化事情,当你让委托参与(匿名函数、方法组转换等)时,它甚至比正常情况更糟糕——可选参数也增加了复杂性!使用不同名称的方法可以让事情更清楚


或者,您是否需要让它过载?难道你不能只使用带有
操作的版本,而忽略回调中的“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);