c# - 使用操作作为参数覆盖方法

标签 c# propertychanged

我有一组方法,允许用户轻松使用 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/

相关文章:

c# - 避免单声道中未安装 PCL 引用程序集错误

c# - 在 ASP.NET (C#) 中创建动态 RSS 提要页面 - 我需要做任何额外的事情吗?

c# - NHibernate:将默认值视为 null 的简单方法(反之亦然)

wpf - 检测何时发生 OnPropertyChanged

C# - 如何根据对另一个属性 (ObservableCollection) 的更改来更改属性的值?

c# - 根据键名选择枚举值

c# - 如何检查模型列表中的重复条目?

wpf - 依赖属性的 PropertyChangedCallback 没有被调用

c# - 在 TextBox 条目暂停期间引发 PropertyChanged 事件?

c# - 监视 WPF 中 Telerik ScheduleView 控件的属性更改