2

ユーザーが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 アクションは 2 つのパラメーターを受け取るようになりました。VS にはメソッドの作成に問題はありませんでしたが (赤い qwigglies はありません)、ビルドすると、最初のメソッドと 2 番目のメソッドの間の使用法があいまいであるという多くのエラーがスローされます。その場合、探しているものをどのように達成できますか?

編集

メソッドの通常の使用法は次のとおりです。

SetPropertyValue(ref _streetAddress1, value, null, () => SalesData.StreetAddress1 = value);
4

1 に答える 1

3

まず、これはオーバーライドではありません- これはオーバーロードです。

メソッド宣言の観点からは問題ありません。あいまいなのは呼び出しサイトだと思います。残念ながら、あなたはそれらのいずれも私たちに見せていません.

個人的には、簡単にするために、ここでは 2 つの異なる名前を使用します。オーバーロードは複雑なビジネスになる可能性があり、(無名関数、メソッド グループの変換などで) デリゲートが関与するまでには、通常よりもさらに悪化します。また、オプションのパラメーターも複雑さを増します! メソッドに異なる名前を付けると、物事がより明確になります。

または、オーバーロードする必要がありますか? Action<T, T>気にしない場合は、コールバック内の「古い」値を無視して、バージョンを取得することはできませんか? それは物事を単純化するでしょう。

于 2012-02-29T18:32:14.690 に答える