Как выполнить рефакторинг переключателя, вернуть значения и вызвать асинхронные методы сразу - PullRequest
0 голосов
/ 17 мая 2018

Я на самом деле использую этот переключатель и хотел реорганизовать его, поскольку он может значительно возрасти в зависимости от использования моего приложения.

switch (something)
{
    case "emisores":
        return await StampEmisor(id);
    case "tipodocumento":
        return await StampTipoDocumento(id);
    case "plantillas":
        return await StampPlantilla(id);
    default:
        return BadApiRequest("blabla was not found.");
}

Мне нужно:

1.- Возвращаемые значения

2.- Передать параметры

3.- Вызвать асинхронные методы

Я пытался выполнить это решение , но эти 3 условия не применяются.Как я мог это сделать?

Большое спасибо.

1 Ответ

0 голосов
/ 17 мая 2018

Чтобы вернуть значения (1-е требование), вам нужно будет преобразовать Action внутри Dictionary в Function:

new Dictionary<string, Func<>>()

, поскольку это неявно приводит к возвращению TResult,вам нужно будет указать, что вы возвращаете в качестве последнего параметра внутри самого определения Func , и указав на первом месте передаваемый параметр (2-е требование).

Что, наконец, входит в

var stamps = new Dictionary<string, Func<Guid, Task<HttpResponseMessage>>>()
{
    { "emisores", new Func<Guid,Task<HttpResponseMessage>>(StampEmisor) },
    { "tipodocumento",new Func<Guid,Task<HttpResponseMessage>>(StampTipoDocumento)},
    { "plantillas", new Func<Guid,Task<HttpResponseMessage>>(StampPlantilla)},
    { "reglas", new Func<Guid, Task<HttpResponseMessage>>(StampRegla) }
};

Теперь, чтобы вызвать его , ожидаемо (3-е условие), просто вызовите .Invoke(id) сawait заявление.В этом случае return await, потому что мы хотим вернуть предоставленное значение:

if (stamps.ContainsKey(entity))
    return await stamps[entity].Invoke(id);
...