如何重构一个开关,返回值并立即调用异步方法

时间:2018-05-17 07:43:00

标签: c# dictionary switch-statement refactoring

我实际上正在使用此开关,并希望重构它,因为它可以根据我的应用程序的使用而显着增长。

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.-调用异步方法

我尝试了this solution,但这三个条件并未适用。我怎么能这样做?

非常感谢。

1 个答案:

答案 0 :(得分:1)

要返回值(第一个要求),您必须将Action内的Dictionary转换为Function

new Dictionary<string, Func<>>()

由于这隐含地使其返回TResult,您必须指定您将作为 Func 定义内的最后一个参数返回 ,并首先指定您传递的参数(第二项要求)。

最终进入

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

现在,为了等待等待(第三个条件),只需使用.Invoke(id)语句调用await即可。在这种情况下,return await因为我们想要返回提供的值:

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