Хлоп:
public IEnumerable<Item> DoOtherStuff(IEnumerable<Item> someItems,
Func<
IGrouping<DateTime, Item>,
Func<Func<Item, decimal>, decimal>
> aggregateForGrouping
)
{
var items = someItems.GroupBy(i => i.Date)
.Select(p => new Item(p.Key, aggregateForGrouping(p)(r => r.Value)));
// ...
}
DoOtherStuff(someItems, p => p.Max);
Ммм, не делай этого, делай то, что сказал ДжаредПар ...
Или, если вы все еще хотите получить этот синтаксис, используйте какой-нибудь серьезный псевдоним.
using ItemGroupingByDate = IGrouping<DateTime, Item>;
using AggregateItems = Func<Func<Item, decimal>, decimal>;
public IEnumerable<Item> DoOtherStuff(
IEnumerable<Item> someItems,
Func<ItemGroupingByDate, AggregateItems> getAggregateForGrouping
)
{
var items = someItems.GroupBy(i => i.Date)
.Select(p => new Item(p.Key, getAggregateForGrouping(p)(r => r.Value)));
// ...
}
Это может быть почти читабельно, если вы можете использовать псевдонимы в других псевдонимах или сопоставлять пользовательских делегатов с совпадающими сигнатурами Func, тогда вы можете вставить здесь «селектор» вместо «Func».
Мы все еще спускаемся по кроличьей норе, так что это не то решение, которое вы ищете. Просто положите сюда для демонстрации:)