我有这样的类,基于Slack的api:返回的json
public class Response<T>
{
public bool ok { get; set; }
public string error { get; set; }
}
public class PostMessage : Response<PostMessage>
{
public string ts { get; set; }
public string channel { get; set; }
public Message message { get; set; }
}
public class ChannelsHistory : Response<ChannelsHistory>
{
public string latest { get; set; }
public List<Message> messages { get; set; }
public bool has_more { get; set; }
}
我想写一个单独的方法来限制对JsonConvert.DeserializeObject<T>
的调用。我不太了解该方法背后的实现细节,但我认为这会起作用:
internal static Response<T> GetSlackResponse<T>(List<KeyValuePair<string, string>> parameters = null)
{
Uri slackUri = BuidSlackUri(typeof(T), parameters);
String jsonResponse = GetJson(slackUri);
Response<T> response = JsonConvert.DeserializeObject<Response<T>>(jsonResponse);
if (!response.ok)
{
Aesthetic.Catch("The Slack API failed to respond successfully. " + response.error);
}
return response;
}
没有什么失败,但并不是所有我需要的属性都被反序列化了。例如,对GetSlackResponse()的调用将返回一个ok设置为true的响应,但我无法访问PostMessage类的Message属性。我尝试过类型转换(显式和使用as
),但都没有成功。
我肯定我遗漏了一些简单的东西,有人能指出吗?
让我的各种响应类扩展一个泛型类是转移注意力;它只会使问题更加混乱。我只需要方法是泛型的,而不是类型本身。
从更改GetSlackResponse<T>()
方法中的相关行
Response<T> response = JsonConvert.DeserializeObject<Response<T>>(jsonResponse);
至
T response = JsonConvert.DeserializeObject<T>(jsonResponse);
修复了所有问题。现在,我的各种响应类型只需要扩展我的基类response,和将被JSON.NET正确地反序列化。响应不需要是泛型类型的对象。