#c# #asynchronous #repeat
#c# #асинхронный #повторить
Вопрос:
Я новичок в c #, и у меня есть (для меня:) сложное приложение с grpc-интерфейсом.
У меня есть около 20 (и возрастающих) различных функций, в которых я передаю разные параметры и возвращаю разные типы:
private async Task<VersionOfInterfaceReply> Function1()
{
...
}
private async Task<ReturnInfoReply> Function2(
List<NozzleToChange> nozzlelist,
SideType side = SideType.Right,
UInt32 processingarea = 1)
{
...
}
после этого я хочу вызвать, получить, оценить эти результаты тестирования и повторить некоторые функции.
{
ResetTestResult();
result = await Function1();
if (result.success = true) { testresult.TestLog = $"message with variables of resultn"; }
TestPassed(result);
ResetTestResult();
result = await Function2(x,y,z);
if (result.success = true) { testresult.TestLog = $"{result.xy} message with variables of resultn"; }
TestPassed(result);
}
результат уже является динамической переменной (если вы знаете лучшие способы, дайте мне знать)… но мой вопрос заключается в следующем:
Как я могу избавиться от ResetTestResult(); и Testpassed(результат) с каким-то переносом моих функций?
Возможно ли это вообще с разными типами выходных данных / параметров и разным количеством параметров
Я хотел бы иметь что-то вроде:
privat async Task? / or void CallFunction(Method givenMethod, string message)
{
ResetTestResult();
result = await givenMethod();
if (result.success = true) { testresult.TestLog = $"" message " with variables of resultn"; }
TestPassed(result);
}
and call this like this:
{
...
CallFunction(Function1(),"message1");
CallFunction(Function2(x,y,z),"message2 {variable2}");
...
}
Я пытался понять делегаты, функции и действия, но я не совсем уверен, работает ли это для меня. И еще одна проблема — асинхронная часть…
Если вам нужна дополнительная информация, дайте мне знать.
заранее спасибо за помощь
с уважением, Крис
Комментарии:
1. Являются ли ваши возвращаемые типы (
VersionOfInterfaceReply
,ReturnInfoReply
) производными от одного и того же базового типа / интерфейса?2. Вы можете либо использовать отражение внутри вашей «CallFunction», чтобы вызвать функцию на основе указанного имени, либо использовать лямбда-выражения и передать вызов метода в качестве параметра «CallFunction (например: () => Function1())
3. @JohnathanBarclay Некоторая информация в ответах одинакова (сообщение о времени выполнения), но каждый из них содержит разные данные, иногда одно значение, а иногда массив значений
4. «Избегайте повторения coid» <== Что такое «coid»?
Ответ №1:
Предполагая VersionOfInterfaceReply
и ReturnInfoReply
реализуйте интерфейс, такой как:
interface IReply
{
bool Success { get; }
}
Вы могли бы написать свой метод следующим образом:
private async Task CallFunction<T>(Func<Task<T>> givenMethod, Func<T, string> message)
where T : IReply
{
ResetTestResult();
T result = await givenMethod();
if (result.Success) { testresult.TestLog = message(result); }
TestPassed(result);
}
И используйте следующим образом:
await CallFunction(Function1, x => "message1");
await CallFunction(() => Function2(x, y, z), x => $"message2 {x.Variable2}");
Для вызова методов с аргументами вы можете создать замыкание, используя лямбда-выражение.