Хорошо, основываясь на комментарии, я подозреваю ответа нет - вам понадобятся универсальные типы более высокого порядка. Вы бы хотели что-то вроде:
// Not real syntax!
interface IFunctor<TFunctor<?>, TValue>
where TFunctor<X> : IFunctor<TFunctor<X>, TValue>
{
TFunctor<TProjection> Project<TProjection>(Func<TValue, TProjection> func);
}
Проблема состоит в том, чтобы выразить идею о том, что реализация интерфейса должна также быть универсальной определенным образом и позволять использовать эти общие отношения в остальной части интерфейса. Боюсь, это не является частью обобщений .NET.
Джо Даффи писал о , желающем для типов более высокого порядка до сих пор - к сожалению, я не могу сказать, актуальна ли эта статья, так как я не могу добраться до нее в данный момент. (Его блог-сервер несколько временен, но контент отличный:)
Это не совсем понятно, но возможно, вы просто говорите о LINQ to Objects , в основном. Например:
var kids = people.Where(x => x.Age < 18) // Filtering
.Select(x => x.Name) // Projection
.ToList();
Вы можете написать более универсальный интерфейс, например,
public interface IFunctor<T>
{
IFunctor<TOther> Foo<TOther>(Func<T, TOther> selector);
}
... но на самом деле такой интерфейс не реализован List<T>
и т. Д. LINQ to Objects работает вместо этого с помощью методов расширения.