2010-06-30 53 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只是看他的帖子下他的一些模式。