У меня есть специализированный список, который содержит элементы типа IThing
:C#: Получение максимальных и минимальных значений произвольных свойств всех элементов в списке
public class ThingList : IList<IThing>
{...}
public interface IThing
{
Decimal Weight { get; set; }
Decimal Velocity { get; set; }
Decimal Distance { get; set; }
Decimal Age { get; set; }
Decimal AnotherValue { get; set; }
[...even more properties and methods...]
}
Иногда мне нужно знать максимум или минимум определенного свойство всех вещей в списке. Из-за того, что «Tell не спрашивайте», мы перечислим список:
public class ThingList : IList<IThing>
{
public Decimal GetMaximumWeight()
{
Decimal result = 0;
foreach (IThing thing in this) {
result = Math.Max(result, thing.Weight);
}
return result;
}
}
Thats very nice. Но иногда мне нужен минимальный вес, иногда максимальная скорость и так далее. Я не хочу пару GetMaximum*()/GetMinimum*()
для каждого отдельного объекта.
Одним из решений было бы отражение. Нечто подобное (зажмите нос, сильный запах кода!):
Decimal GetMaximum(String propertyName);
Decimal GetMinimum(String propertyName);
Есть ли лучше, менее вонючие способы сделать это?
Спасибо, Эрик
Редактировать: @ Matt: .Net 2.0
Заключение: Там нет лучшего способа для .Net 2.0 (с Visual Studio 2005). Возможно, мы скоро перейдем к .Net 3.5 и Visual Studio 2008. Спасибо, парни.
Заключение: Существуют различные способы, которые намного лучше, чем отражение. В зависимости от времени исполнения и версии C#. Взгляните на Jon Skeets, ответьте на различия. Все ответы очень полезны.
Я поеду для предложения Sklivvz (анонимные методы). Существует несколько фрагментов кода от других людей (Конрад Рудольф, Мэтт Гамильтон и Коинкойн), которые реализуют идею Скливвца. К сожалению, я могу только «принять» один ответ.
спасибо. Вы все можете чувствовать себя «принято», Altough только Sklivvz получает кредиты ;-)
Я добавил рабочую реализацию – Sklivvz 2008-09-30 23:56:40