Как можно очистить этот код от дублирования? - PullRequest
2 голосов
/ 01 июля 2010

У меня есть следующий код, который имеет некоторое дублирование

    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;
    }

и еще несколько похож на него с похожим рисунком.Каков наилучший способ изменить это, чтобы избежать дублирования

Ответы [ 5 ]

4 голосов
/ 01 июля 2010

Просто удар в темноте, но вот что вам нужно:

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 методе

2 голосов
/ 01 июля 2010

Если вы можете изменить свои модели для реализации общего интерфейса (или наследовать от общего базового класса), то вы можете сделать что-то вроде этого:

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 { /* ... */ }
1 голос
/ 01 июля 2010
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 голосов
/ 01 июля 2010

Я также настоятельно рекомендую вам взглянуть на некоторые блоги Мэтью Кохрана о шаблонах.Я нашел их действительно полезными.Вот один из них: Шаблон посетителя и просто посмотрите под его сообщениями несколько его шаблонов.

0 голосов
/ 01 июля 2010

Может быть шаблонизировать функцию по типу элемента списка и передать в список?

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...