2015-11-02 203 views
0

我有一些代码:RESTClient实现返回通用响应

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; } 
} 

作为响应我可以找到包含具有来自url的值的字段的对象Data(response.Data)。

例如,我收到Data的响应:{ResultCheck = true,Message =“Result!” } 如何从任何没有指定类型的对象 - MyClass接收URL的填充数据。我不想接收任何不同网址的回复。我想收到一些匿名对象。

回答

1

一种方法是使用Genericsdynamic对象。这应该允许您指定任何要转换为响应的对象类型。

您可以因此,该方法改变为

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; 
+0

我可以做,没有泛型?我不想为不同的网址创建类型。我将使用返回类型的SendRequest()发送到其他地方。并且该应用程序不知道它将接收什么类型的对象。我是否可以为任何对象通用而无需为它们声明类? – Anton23

+0

@ Anton23请参阅编辑。 –

+0

这不是我所需要的。 taskCompletionSource.Task应该返回包含Data对象的对象,其中包含来自url的所有字段。两个应用程序中都没有泛型类和类声明。 – Anton23