2015-11-02 7 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; } 
} 

в ответ я могу найти объект данных (response.Data), который содержит поля со значениями из URL.

Например, я получаю ответ с данными: {ResultCheck = true, Message = "Result!" } Как получить заполненные данные из URL-адреса с любым объектом без определенного типа - MyClass. Я не хочу получать ответ с любым количеством полей для разных URL-адресов. Я хочу получить анонимный объект.

ответ

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

Могу ли я сделать это без дженериков? Я не хочу создавать типы для разных URL-адресов. Я собираюсь использовать возвращаемый тип SendRequest() для отправки в другое место. И это приложение не знает, какой тип объекта он получит. Могу ли я сделать это универсально для любых объектов без объявления классов для них? – Anton23

+0

@ Anton23 См. Править. –

+0

Это не то, что мне нужно. taskCompletionSource.Task должен возвращать объект, который будет содержать объект Data со всеми полями из url. Нет общих типов и деклараций классов в обоих приложениях. – Anton23

Смежные вопросы