我正在尝试创建一个基于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);
}
}
问题是,转变正在抱怨:
预期值为常量
每个案例都用红色加下划线。 有谁知道我做错了什么?
答案 0 :(得分:11)
正如已经指出的那样,问题在于HttpMethod
Delete
,Post
,...等等。属性是实例,而不是常量或枚举。还有人指出它们是等同的。
我唯一要补充的是,如果这是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.Put
和HttpMethod.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);
}
}