2010-06-30 50 views
2

我有以下代碼,其具有一些重複這段代碼如何清除以消除重複?

private List<SelectListItem> GetDeskList(int deskId) 
    { 
     List<Desk> apps = Model.GetDesks(); 

     List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem 
     { 
      Selected = c.Id == deskId, 
      Text = c.Name, 
      Value = c.Id.ToString() 
     }).ToList(); 
     dropdown.Insert(0, new SelectListItem()); 
     return dropdown; 
    } 

    private List<SelectListItem> GetRegionList(int regionId) 
    { 
     List<Region> apps = Model.GetRegions(); 

     List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem 
     { 
      Selected = c.Id == regionId, 
      Text = c.Name, 
      Value = c.Id.ToString() 
     }).ToList(); 
     dropdown.Insert(0, new SelectListItem()); 
     return dropdown; 
    } 

和一些更喜歡它與一個類似的模式。什麼是重構這避免重複

回答

2

如果你可以改變你的模型,以實現共同的接口(或從一個公共基類繼承),那麼你也許能夠做這樣的事的最好辦法:

var desks = GetList(123,() => Model.GetDesks()); 

var regions = GetList(456,() => Model.GetRegions()); 

// ... 

private List<SelectListItem> GetList<T>(int id, Func<List<T>> getApps) 
    where T : IDropdownItem 
{ 
    List<T> apps = getApps(); 

    List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem 
     { 
      Selected = c.Id == id, 
      Text = c.Name, 
      Value = c.Id.ToString() 
     }).ToList(); 

    dropdown.Insert(0, new SelectListItem()); 
    return dropdown; 
} 

public interface IDropdownItem 
{ 
    int Id { get; } 
    string Name { get; } 
} 

public class Desk : IDropdownItem { /* ... */ } 

public class Region : IDropdownItem { /* ... */ } 
+0

在你的例子中,我不能編譯你的解決方案,因爲我得到錯誤,它無法解決c.Id或c.Name。任何想法爲什麼? – leora 2010-06-30 23:53:18

+0

@ooo:我剛剛做了一個修改。爲了這個工作,你的模型需要實現一個通用的接口(或從一個公共的基類繼承)與這些屬性。 – LukeH 2010-06-30 23:58:52

4

只是在黑暗中刺,但這樣的事情是你應該頭:

private List<SelectListItem> GetList<T>(List<T> list, int Id) 
{ 
    List<SelectListItem> dropdown = list.ConvertAll(c => new SelectListItem 
    { 
     Selected = c.Id == Id, 
     Text = c.Name, 
     Value = c.Id.ToString() 
    }).ToList(); 
    dropdown.Insert(0, new SelectListItem()); 
    return dropdown; 
} 

,並在你的類型安全列表通過調用該方法GetList的方法,而不是

1
private List<SelectListItem> GetObjectList<ObjectType>(int id, Func<List<ObjectType>> getObjects) 
{ 
    List<ObjectType> apps = getObjects(); 

    List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem 
    { 
     Selected = c.Id == id, 
     Text = c.Name, 
     Value = c.Id.ToString() 
    }).ToList(); 
    dropdown.Insert(0, new SelectListItem()); 
    return dropdown; 
} 

private List<SelectListItem> GetDeskList(int deskId) 
{ 
    return GetObjectList(deskId, (() -> Model.GetDesks())); 
} 

private List<SelectListItem> GetRegionList(int regionId) 
{ 
    return GetObjectList(regionId, (() -> Model.GetRegions())); 
} 
0

也許templatize列表項類型的功能,並通過列表?

private List<SelectListItem, ItemType> GetRegionList(int theId, List<ItemType> apps) 
{ 
    List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem 
    { 
     Selected = c.Id == theId, 
     Text = c.Name, 
     Value = c.Id.ToString() 
    }).ToList(); 
    dropdown.Insert(0, new SelectListItem()); 
    return dropdown; 
} 

List<Desk> apps = Model.GetDesks(); 
GetRegionList<SelectListItem,Desk>(ID, apps); 
0

我也強烈建議你看看馬修科克倫的一些模式博客。我發現他們真的很有幫助。這裏是一個: Visitor pattern只是看他的帖子下他的一些模式。