Функция переноса / Избежать повторения coid

#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}");
  

Для вызова методов с аргументами вы можете создать замыкание, используя лямбда-выражение.

Рабочий пример