У меня есть специализированный список, который содержит элементы типа 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...]
}
Иногда мне нужно знать максимум или минимум определенного свойства всех вещей в списке. Из-за «Скажи, не спрашивай» мы позволили списку выяснить это:
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);
Есть ли лучшие, менее вонючие способы сделать это?
Спасибо,
Eric
Редактировать: @Matt: .Net 2.0
Вывод: лучшего способа для .Net 2.0 (с Visual Studio 2005) не существует. Возможно, нам стоит перейти на .Net 3.5 и Visual Studio 2008 в ближайшее время. Спасибо, ребята.
Заключение: Есть разные способы, которые намного лучше, чем отражение. В зависимости от времени выполнения и версии C #. Посмотрите на ответ Джона Скитса для различий. Все ответы очень полезны.
Я пойду на предложение Sklivvz (анонимные методы). Есть несколько фрагментов кода от других людей (Конрад Рудольф, Мэтт Гамильтон и Coincoin), которые реализуют идею Sklivvz. К сожалению, я могу только «принять» один ответ.
Большое спасибо. Вы все можете чувствовать себя «принятым», хотя только Sklivvz получает кредиты; -)