В C # мы можем использовать типы Func<>
и Action<>
для хранения того, что по сути является управляемыми указателями на методы.Однако, по моему опыту, они должны быть явно напечатаны при определении: Func<int> someFunc = myObject.MyMethod;
Я пытаюсь разработать свободный API, который может связывать различные методы, предполагая, что они имеют совместимую подпись.Например:
public int IntMethodA( value ) { return value * 2; }
public int IntMethodB( value ) { return value * 4; }
public double DoubleMethod( value ) { return value / 0.5; }
public double ChainMethod( value )
{
return IntMethodA( value )
.Then( IntMethodB )
.Then( DoubleMethod );
}
Это то, что поддерживается классом .NET Task<>
.Однако в целях обучения я пытаюсь разработать что-то подобное с нуля, и у меня остались несколько вопросов:
IntMethodA
возвращает целое число.Чтобы достичь чего-то подобного, мне, вероятно, потребуется написать метод расширения для Func<>
вместе со всеми возможными общими перегрузками. Это означает, что мне нужно привести исходный метод как Func
, а затем вернуть объект построителя, который может принимать последующие методы. Есть ли способ, которым я могу избежать этого начального приведения, чтобы сохранить завершенностьбеглость?
Есть ли способ автоматизации или создания универсальных методов построения, которые принимают функции и добавляют их в цепочку?
Например,, рассмотрим:
public int IntMultiply( int a, int b ) { return a * b; }
public Tuple<double, double> Factor( int value )
{
/* Some code that finds a set of two numbers that multiply to equal 'value' */
}
Эти два метода имеют разные сигнатуры и возвращаемые типы.Однако, если я хочу связать IntMultiply().Then( Factor );
, это должно сработать, потому что ввод Factor
имеет тот же тип, что и вывод IntMultiply
.
Тем не менее, создается универсальный свободный API, который может сделать этокажется проблемой.Мне нужно было бы иметь возможность каким-то образом принимать возвращаемый тип IntMultiply
и ограничивать любые дополнительные методы, чтобы принимать только этот тип в качестве входных данных.Это вообще возможно сделать?
Если у кого-то есть понимание того, как можно подходить к этому проекту, или если есть существующие проекты, которые делают что-то подобное, я был бы признателен.