C# 如何清理此代码以消除重复?
我有以下代码,其中有一些重复C# 如何清理此代码以消除重复?,c#,refactoring,code-duplication,C#,Refactoring,Code Duplication,我有以下代码,其中有一些重复 private List<SelectListItem> GetDeskList(int deskId) { List<Desk> apps = Model.GetDesks(); List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem { Sele
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;
}
private List GetDeskList(int deskId)
{
List apps=Model.GetDesks();
列表下拉列表=apps.ConvertAll(c=>new SelectListItem
{
所选=c.Id==桌面Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
}
私有列表GetRegionList(int regionId)
{
List apps=Model.GetRegions();
列表下拉列表=apps.ConvertAll(c=>new SelectListItem
{
所选=c.Id==区域Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
}
还有一些类似的图案。重构此模型以避免重复的最佳方法是什么?如果您可以更改模型以实现公共接口(或从公共基类继承),则可以执行以下操作:
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;
}
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 { /* ... */ }
var-desks=GetList(123,()=>Model.GetDesks());
var regions=GetList(456,()=>Model.GetRegions());
// ...
私有列表GetList(int-id,Func-getApps)
其中T:IDropdownItem
{
List apps=getApps();
列表下拉列表=apps.ConvertAll(c=>new SelectListItem
{
所选=c.Id==Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
}
公共接口IDropdownItem
{
int Id{get;}
字符串名称{get;}
}
公共课课桌:IDropdownItem{/*…*/}
公共类区域:IDropdownItem{/*…*/}
只是暗中捅了一刀,但你应该这样做:
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;
}
private List GetList(List List,int-Id)
{
List dropdown=List.ConvertAll(c=>new SelectListItem
{
所选=c.Id==Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
}
并传入类型安全列表,而不是调用GetList
方法中的方法
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()));
}
{
List apps=getObjects();
列表下拉列表=apps.ConvertAll(c=>new SelectListItem
{
所选=c.Id==Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
}
私有列表GetDeskList(int deskId)
{
返回GetObjectList(deskId,(()->Model.GetDesks());
}
私有列表GetRegionList(int regionId)
{
返回GetObjectList(regionId,(()->Model.GetRegions());
}
是否可以对列表项类型上的函数进行模板化,然后传入列表
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);
private List GetRegionList(int-theId,List-apps)
{
列表下拉列表=apps.ConvertAll(c=>new SelectListItem
{
所选=c.Id==Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
}
List apps=Model.GetDesks();
GetRegionList(ID、应用程序);
我还强烈建议您看看Matthew Cochran关于模式的一些博客。我发现它们真的很有用。这里有一个:
只要在他的帖子下面看看他的一些模式。在你的例子中,我无法编译你的解决方案,因为我遇到了无法解析c.Id或c.Name的错误。知道为什么吗?@ooo:我刚刚编辑了一篇。为此,您的模型需要使用这些属性实现公共接口(或从公共基类继承)。