У меня есть специализированный список, содержащий элементы типа IThing
:
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;
}
}
Это очень приятно. Но иногда мне нужен минимальный вес, иногда максимальная скорость и так далее. Мне не нужна пара 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. Спасибо, ребята.
Заключение: Существуют разные способы, которые намного лучше, чем отражение. В зависимости от времени исполнения и версии С#. Взгляните на Jon Skeets, ответьте на различия. Все ответы очень полезны.
Я поеду для предложения Sklivvz (анонимные методы). Существует несколько фрагментов кода от других людей (Конрад Рудольф, Мэтт Гамильтон и Коинкойн), которые реализуют идею Скливвца. К сожалению, я могу только "принять" один ответ.
Большое спасибо. Вы можете чувствовать себя "принятым", хотя только Sklivvz получает кредиты; -)