Помимо «классического» способа работы с замыканиями:
public class ClosureProvider {
private Foo shared;
public Func<object> GetFirst() {
return new Func<object>(() => { /* Use shared and whatever else */ });
}
public Action<Bar> GetSecond() {
return new Action<Bar>(bar => { /* Use shared and whatever else */ });
}
}
Компилятор c # создаст для вас требуемую инфраструктуру, а две возвращенные функции имеют доступ к общему и другим вещам, которые вы хотите использовать