Предположим, у меня есть функция, которая преобразует некоторые входные данные в некоторые выходные данные:
TypeB MyFunction(TypeA input);
У меня есть несколько очень похожих функций, за исключением MyFunction, все они имеют следующий шаблон:
int Example1(...)
{
TypeA a = X();
TypeB b = MyFunction(a);
int z = Z(x, y);
return z;
}
Единственная разница - это MyFunction. X и Z на самом деле не являются функциями, это операторы LINQ, которые возвращают анонимные типы, поэтому я решил создать одну функцию с параметром MyFunction
:
int Example2(Func<TypeA, TypeB> MyFunction)
{
TypeA a = X();
TypeB b = MyFunction(a);
int z = Z(x, y);
return z;
}
Так что теперь есть только одно место, где я использую последовательность A - MyFunction - C. Если в будущем A изменится на что-то другое, все пользователи Example2 автоматически получат этот новый A.
Использование (для простоты: typeA и typeB - это int):
int B1 (int a) {...}
int B2 (int a) {...}
int i = Example2(B1);
int j = Example2(B2);
Это отлично работает. Но теперь у меня есть версия, где MyFunction является асинхронной
Task<int> B1Async(int a) {...}
Можно ли создать делегата для B1Async, чтобы я все еще мог использовать Example1,
async Task<int> DoItAsync
{
// create a delegate for B1Async:
Func<int, int> B1AsyncDelegate = ...
// call Example1:
???
}
или мне нужно создать асинхронную версию