Это чрезмерное использование методов расширения? - PullRequest
3 голосов
/ 07 ноября 2011

Я хочу сделать некоторые функции как можно более общими.

В моих приложениях MVC мне нужно преобразовать ряд сложных объектов IEnumerable в списки выбора для отображения раскрывающегося списка и т. Д.

ВСначала я создал статический класс List с методами преобразования для каждого сложного объекта.Это составило много кода.Затем я начал использовать операторы linq для выполнения преобразования:

var list = (from o in SessionTypes select new SelectListItem { Value = o.ID.ToString(), Text = o.Title }).ToList();

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

Я наконец-то решил что-то похожее на:

public IEnumerable<SelectListItem> ToSelectList<T>(IEnumerable<T> enumerable, Func<T, string> value, Func<T, string> text)
    {
        return enumerable.Select(f => new SelectListItem()
        {
            Value = value(f),
            Text = text(f),
        });
    }

и, чтобы его было проще использовать, я сделал метод расширения:

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> value, Func<T, string> text)
    {
        return enumerable.Select(f => new SelectListItem()
        {
            Value = value(f),
            Text = text(f),
        });
    }

Итак, теперь всеЯ должен сделать это:

var list = SessionTypes.ToSelectList(o => o.ID.ToString(), o => o.Title) as List<SelectListItem>; 

У меня есть аналогичные методы, такие как .ToDictionary тоже.

Это чрезмерное использование методов расширения?Я беспокоюсь, что я прячу слишком много кода в методах расширения, которые могут искажать мои модели. Было бы лучше использовать преобразования linq для прозрачности?

Ответы [ 3 ]

4 голосов
/ 07 ноября 2011

Вы можете привязать IDictionary<,> к DropDownList DataSource напрямую, в WebForms вам нужно указать сопоставления, такие как DataValueField="Key" и DataTextField="Value". Учитывая это, почему бы просто не использовать метод LINQ ToDictionary()?

dropDownList.DataValueField = "Key";
dropDownList.DataTextField = "Value";
dropDownList.DataSource = 
                SessionTypes.ToDictionary(k => k.ID.ToString(), 
                                          v => v.Title);
2 голосов
/ 07 ноября 2011

Данное руководство взято из C # в глубине:

"Метод расширения является приемлемым, если он применим ко всем экземплярам расширенного типа. Если он подходит только в определенных ситуациях, сделайте это яснымчто метод не является частью типа, оставляя его как «нормальный» статический метод ».

Пока вы не против использования этого метода расширения для всех экземпляров типа IEnumerable, выхорошо пойти.

В более легкой заметке я бы скорее назвал метод расширения как ToSelectListItem, а не ToSelectList, чтобы сделать его понятным для конечного пользователя.Опять же, это мое личное предпочтение.

2 голосов
/ 07 ноября 2011

Это вполне приемлемое использование методов расширения.

Пока их описательно называют и делают то, что они говорят, у вас не должно быть проблем.

...