Что я хочу сделать, это комбинировать лямбда-синтаксис с "параметрами" для выполнения действия над серией объектов.
Скажем, я хочу сделать кучу элементов управления невидимыми.
После небольшого ворча я закончил метод расширения:
public static void On<T>(this Action<T> actionToCarryOut,params T[] listOfThings)
{
foreach (var thing in listOfThings)
{
actionToCarryOut(thing);
}
}
а затем я могу создать действие:
Action<Control> makeInvisible = c => c.Visible = false;
а затем назовите его:
makeInvisible.On(control1,control2, control3,control4);
Это не очень хороший синтаксис, хотя - он чувствует себя ужасно неуклюжим.
Я могу создать метод "Применить" в базовом классе:
protected void Apply<T>(Action<T> action, params T[] appliedTo)
{
foreach (var item in appliedTo)
{
action(item);
}
}
а затем вызовите его следующим образом:
Apply<Control>(
c => c.Visible = false,
control1,
control2,
control3,);
Но это означает повторение метода в каждом базовом классе, в котором он мне нужен, и я теряю преимущество вывода типа.
Есть ли менее неуклюжий способ сделать это?
Изменить: Самый приятный метод, который я видел до сих пор, - это плавный подход, который (с несколькими настройками) позволил бы мне написать:
Apply.Method((Control c) => c.Visible = false).To(
control1,
control2,
control3,
control4};
Это 91 символ, по сравнению с 107 для использования простого "foreach". Это заставляет меня поверить, что "foreach" действительно может быть лучшим подходом в конце концов!