2016-11-11 61 views
1

我有以下類:重構一個它可以處理多種類型的方法?

public class Disciplines 
{ 
    public int Id { get; set; } 
    public string Discipline { get; set; } 
    public bool IsChecked { get; set; } 
} 

我的項目有使用類的形式來創建一個複選框組幾個視圖模型:

public List<Disciplines> DisciplinesCBG { get; set; } 

我節省的複選框以選擇該數據庫爲逗號分隔字符串,然後分裂的逗號的字符串重新顯示爲複選框:

public static UserProfileViewModel DisciplinesStringToCheckboxGroup(UserProfileViewModel model) 
{ 
    string[] disciplineArray = model.Disciplines.Split(','); 
    for (int i = 0; i < model.DisciplinesCBG.Count; i++) 
    { 
     string currentValue = model.DisciplinesCBG[i].Discipline; 
     if(Array.IndexOf(disciplineArray, currentValue) > -1) 
     { 
      model.DisciplinesCBG[i].IsChecked = true; 
     } 
    } 
    return model; 
} 

我的問題是,浩w除了UserProfileViewModel之外,我還可以編寫可用於其他ViewModel類型的方法嗎?例如,我有一個名爲RegisterViewModel的視圖模型,它使用與public List<Disciplines> DisciplinesCBG { get; set; }相同的public List<Disciplines> DisciplinesCBG { get; set; },我希望能夠使用與上述相同的方法,而不必複製它並更改簽名。我假設這是可能的?

回答

3

您可以創建一個接口,該接口具有DisciplinesDisciplinesCBG屬性,然後在要應用的每個類中實現它。

interface IHasDiciplines 
{ 
    string Disciplines { get; set; } 
    List<Disciplines> DisciplinesCBG { get; set; } 
} 

class UserProfileViewModel : IHasDiciplines 
{ 
    public string Disciplines { get; set; } 
    public List<Disciplines> DisciplinesCBG { get; set; } 
} 

public static IHasDiciplines DisciplinesStringToCheckboxGroup(IHasDiciplines model) 
{ 
    string[] disciplineArray = model.Disciplines.Split(','); 
    for (int i = 0; i < model.DisciplinesCBG.Count; i++) 
    { 
     string currentValue = model.DisciplinesCBG[i].Discipline; 
     if(Array.IndexOf(disciplineArray, currentValue) > -1) 
     { 
      model.DisciplinesCBG[i].IsChecked = true; 
     } 
    } 
    return model; 
} 
+0

您的最後一種方法也可以是擴展方法。不確定一個簡單的基類在這種情況下不會比接口更好。 – BradleyDotNET

+0

@BradleyDotNET它也可以是一個BaseClass,但如果以後你需要添加'HasFoo','HasBar','HasSomething',它會變得複雜。 –

+0

當然,在這一點上寧願組成繼承似乎成爲一個主要因素。不是說接口是錯誤的*,而是「IHaveSomething」的接口有點紅旗 – BradleyDotNET

相關問題