2012-02-29 61 views
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操作現在需要兩個參數。 VS沒有與我創建方法的問題(沒有紅色的qwigglies),但是當我建立它會引發很多錯誤,說第一種方法和第二種方法之間的用法是模棱兩可的。如果是這樣的話,我該如何實現我所期望的?

EDIT

下面是該方法的通常的用法:

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

正如Jon所要求的:請向我們展示實際的呼叫站點,因爲這是導致問題的原因。你有「很多」的錯誤,因爲你調用的方法「很多」次! – dlev 2012-02-29 18:50:39

+0

我更新了。我認爲喬恩的建議是合理的(當然)。我只是想改變它的名字。 – 2012-02-29 18:59:47

+0

@TheSheekGeek在我的(可能是不正確的)觀點中,除了內置的「基元」類型之外,對任何其他東西使用可選參數幾乎不是一個好主意。 – asawyer 2012-02-29 19:02:00

回答

3

首先,這是不壓倒一切 - 這是超載

從方法聲明的角度來看,這很好 - 我懷疑是呼叫站點這是不明確的。不幸的是,您沒有向我們展示任何這些信息。

就我個人而言,我會在這裏使用兩個不同的名稱來保持簡單。 Overloading can be a complex business,當你有代表參與(使用匿名函數,方法組轉換等)時,它比正常情況更差 - 並且可選參數也增加了複雜性!使用不同名稱的方法可以使事情更清晰。

另外,你是否需要重載它?難道你不能只擁有Action<T, T>的版本,只是當你不關心它時忽略回調中的「舊」值?這將簡化事情。

+1

我想這是因爲動作參數= null默認值。它們在呼叫站點設置,因此可能不明確。 – asawyer 2012-02-29 18:36:48

+0

@asawyer:可以。沒有看到任何呼叫站點很難說。超載時泛型,委託和可選參數的混合是非常討厭的。 – 2012-02-29 18:37:45

+0

對不起,我的意思是超載,我的手指離開了我。今天我打字太多了。 – 2012-02-29 19:03:17