我有一些代码:
public Task<IRestResponse> SendRequest(string url, string bodyJson)
{
var client = new RestClient(url);
var request = new RestRequest();
request.RequestFormat = DataFormat.Json;
request.Method = Method.POST;
request.AddBody(bodyJson);
var taskCompletionSource = new TaskCompletionSource<IRestResponse>();
client.ExecuteAsync(request, response =>
{
taskCompletionSource.SetResult(response);
});
return taskCompletionSource.Task;
}
响应包含所有但不是来自url的答案(响应不包含数据对象)。当我为ExecuteAsync指定对象时:
public Task<IRestResponse<MyClass>> SendRequest(string url, string bodyJson)
{
var client = new RestClient(url);
var request = new RestRequest();
request.RequestFormat = DataFormat.Json;
request.Method = Method.POST;
request.AddBody(bodyJson);
var taskCompletionSource = new TaskCompletionSource<IRestResponse<MyClass>>();
client.ExecuteAsync<MyClass>(request, response =>
{
taskCompletionSource.SetResult(response);
});
return taskCompletionSource.Task;
}
public class MyClass
{
public bool ResultCheck { get; set; }
public string Message { get; set; }
}
作为回应,我可以找到对象Data(response.Data),其中包含来自url的值的字段。
例如,我收到数据响应:{ResultCheck = true,Message =&#34; Result!&#34; } 如何在没有指定类型的情况下从任何对象接收来自url的填充数据 - MyClass。我不想收到针对不同网址的任意数量字段的回复。我想收到一些匿名对象。
答案 0 :(得分:1)
一种方法是使用Generics和dynamic个对象。这应该允许您指定要转换为响应的任何对象类型。
因此,您可以将方法更改为
public Task<IRestResponse<T>> SendRequest<T>(string url, string bodyJson)
{
var client = new RestClient(url);
var request = new RestRequest
{
RequestFormat = DataFormat.Json;
Method = Method.POST;
};
request.AddBody(bodyJson);
var taskCompletionSource = new TaskCompletionSource<IRestResponse<T>>();
client.ExecuteAsync<T>(request, response =>
{
taskCompletionSource.SetResult(response);
});
return taskCompletionSource.Task;
}
然后我们可以使用动态创建临时对象。然后我们可以填写我们需要的所有信息
// Create temp obj
dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;
最后在呼叫站点,我们声明类型是动态的。希望其余的api可以将它转发到客户端,他们可以将对象检索为动态类型。
SendRequest<dynamic>(url, JsonConvert.SerialiseObject(employee));
客户端可以执行类似
的操作dynamic response = GetResponse(...);
var name = response.Name;