2012-10-16 92 views
1

閱讀Skeet's article後,我與一般建議去「..consider重命名的一些方法來減少超載的程度。這個建議雙去時,它的整個繼承層次。」泛型重載歧義

但我想了解更多的歧義(並看看我是否能保持超載!)

這些只是一些測試助手,以幫助殘留部分繁瑣的測試,可能需要各種風味的視圖模型首先處於某種有效或無效狀態。

我開始在兩個視圖模型上使用這些助手,它們沒有繼承關係,並且工作正常。

然後我決定另一個對於另一個用於ViewModelWrapper的過載,它是其他視圖模型類型的基類。所以編譯器抱怨說它不知道哪個擴展名用於VmWrapper的以前工作的子類。

這就是這種情況下的第三次重載和下面的代碼中的第一次。就像我暗示的那樣,我已經消除了過載,但是

有沒有人看到我會如何將這些工作保持爲重載?

乾杯,
Berryl

// SatVm 
public static void MakeValid<TParentModel, TModel>(this ISatelliteVm<TParentModel, TModel> instance, IEntityValidator validator) {...} 

// HubVm 
public static void MakeValid<TParentModel>(this HubViewModel<TParentModel> instance, IEntityValidator validator, bool bValid = true) 
where TParentModel : Entity { ... } 

// VmWrapper  
public static void MakeValid<TModel>(this ViewModelWrapper<TModel> instance, IEntityValidator validator) { ... } 

回答

2

你可以簡單地通過VM的類型使用不同的命名空間爲每個擴展集。

namespace Extensions.Satellite 
{ 
    // SatVm 
    public static void MakeValid<TParentModel, TModel>(this ISatelliteVm<TParentModel, TModel> instance, IEntityValidator validator) {...} 
} 

namespace Extensions.Hub 
{ 
    // HubVm 
    public static void MakeValid<TParentModel>(this HubViewModel<TParentModel> instance, IEntityValidator validator, bool bValid = true) 
     where TParentModel : Entity { ... } 
} 

namespace Extensions.Wrapper 
{ 
    // VmWrapper  
    public static void MakeValid<TModel>(this ViewModelWrapper<TModel> instance, IEntityValidator validator) { ... } 
} 

然後只使用正確的名稱空間。

在相關的新聞,你可能要檢查了這一點:Overriding Extension Methods

+0

這似乎是一個黑客,對不起。 – Adam