我有类似这样的类,基于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的Response,但是我将无法访问PostMessage类的Message属性。我已经尝试过(无论是明确地还是使用as
),都无济于事。
我确定我在这里遗漏了一些简单的东西,有人能说出来吗?
答案 0 :(得分:1)
让我的各种Response类扩展一个通用类型的类是一个红色的鲱鱼;它没有引入任何东西,只是让问题更加混乱。我只需要方法是通用的,而不是类型本身。
更改GetSlackResponse<T>()
方法中的相关行
Response<T> response = JsonConvert.DeserializeObject<Response<T>>(jsonResponse);
到
T response = JsonConvert.DeserializeObject<T>(jsonResponse);
修复了一切。现在我的各种响应类型只需要扩展我的基本Response类,和将被JSON.NET正确反序列化。响应不需要是一般类型的对象。