Спасибо за интересную проблему. Текущие ответы великолепны и предоставляют способ сделать то, что вы просили, с помощью C#. Я бы предложил альтернативу, чтобы сделать код проще для тестирования и, для меня, немного более понятным. Суть того, что вы делали в javascript, - это захват переменных локальной области видимости, что здорово, но также делает этот тип кода трудным для тестирования и немного запутанным. Одна вещь, которая часто делается, - это поднять эти переменные в их собственный класс. Вы можете сделать то же самое с кодом выбора. Например:
class PriorityMethod
{
public virtual bool Invoke()
{
return false;
}
}
class MethodPriorityB : PriorityMethod
{
public MyClass FirstItem { get; set; }
public MyClass SecondItem { get; set; }
public float ExpensiveValue { get; set; }
public override bool Invoke()
{
// use the properties to derive your result...
return true;
}
}
Эти два - из вашего примера, очевидно, это будет больше, чем просто один дочерний класс - представляют методы и их переменные в области видимости, которые мы хотим вызвать в конце. Логики выбора c, которые мы могли бы извлечь из чего-то вроде этого:
class PriorityMethodSelector
{
public PriorityMethod Create(ref int priority, MyClass first, MyClass second)
{
if (priority <= 4)
{
// do something to drive the expensive value
return new MethodPriorityB() { FirstItem = first, SecondItem = second, ExpensiveValue = 1 };
}
return null;
}
public PriorityMethod Create(ref int priorty, MyClass first, IEnumerable<MyClass> items)
{
return null;
}
}
Тогда мы просто соединили все это:
PriorityMethodSelector selector = new PriorityMethodSelector();
int priority = 0;
PriorityMethod method = null;
foreach(var item in items)
{
method = selector.Create(ref priority, special, item) ?? method;
method = selector.Create(ref priority, item, items) ?? method;
}
if (null != method)
method.Invoke();
Другая альтернатива, которую я видел, использовалась для Этот тип проблемы заключается в использовании конечного автомата. Это добавило бы еще большую сложность, но полезно, если ваша логика выбора c становится более сложной.