以HttpMethod作为参数的通用方法

时间:2017-06-22 15:32:08

标签: c#

我正在尝试创建一个基于HttpMethod调用其他方法的方法。 我的方法如下:

public async Task<string> CreateAsync<T>(HttpClient client, string url, HttpMethod method, T data, Dictionary<string, string> parameters = null)
{
    switch(method)
    {
        case HttpMethod.Post:
            return await PostAsync(client, url, data);
        case HttpMethod.Put:
            return await PutAsync(client, url, data);
        case HttpMethod.Delete:
            return await DeleteAsync(client, url, parameters);
        default:
            return await GetAsync(client, url, parameters);
    }
}

问题是,转变正在抱怨:

  

预期值为常量

每个案例都用红色加下划线。 有谁知道我做错了什么?

3 个答案:

答案 0 :(得分:11)

正如已经指出的那样,问题在于HttpMethod DeletePost,...等等。属性是实例,而不是常量或枚举。还有人指出它们是等同的。

我唯一要补充的是,如果这是C#7,您可以使用模式匹配而不是 if..else if .... else if ... chain:< / p>

public async Task<string> CreateAsync<T>(HttpClient client, string url, HttpMethod method, T data, Dictionary<string, string> parameters = null)
{
    switch (method)
    {
        case HttpMethod m when m == HttpMethod.Post:
            return await PostAsync(client, url, data);
        case HttpMethod m when m == HttpMethod.Put:
            return await PutAsync(client, url, data);
        case HttpMethod m when m == HttpMethod.Delete:
            return await DeleteAsync(client, url, parameters);
        default:
            return await GetAsync(client, url, parameters);
    }
}

答案 1 :(得分:2)

由于HttpMethod的静态属性(例如HttpMethod.PutHttpMethod.Post)是HttpMethod类的实例,因此您无法将它们用作switch中的案例表达式}声明,好像它们是enum的成员。

这些对象是等同的,因此您可以在if-then-else链中使用它们,或者在Dictionary<HttpMethod,SomeDelegate>中使用它们SomeDelegate是表示您希望的任务的动作类型运行:

if (method == HttpMethod.Post) {
    return await PostAsync(client, url, data);
} else if (method == HttpMethod.Put) {
    return await PutAsync(client, url, data);
} else if (method == HttpMethod.Delete) {
    return await DeleteAsync(client, url, parameters);
} else {
    return await GetAsync(client, url, parameters);
}

答案 2 :(得分:2)

你不能像dasblinkenlight那样做,Nkosi说。最简单的解决方法是使用HttpMethod.Method和硬编码字符串作为case语句。

public async Task<string> CreateAsync<T>(HttpClient client, string url, HttpMethod method, T data, Dictionary<string, string> parameters = null)
{
    switch (method.Method)
    {
        case "POST":
            return await PostAsync(client, url, data);
        case "PUT":
            return await PutAsync(client, url, data);
        case "DELETE":
            return await DeleteAsync(client, url, parameters);
        default:
            return await GetAsync(client, url, parameters);
    }
}