Можем ли мы сделать этот метод универсальным?

StackOverflow https://stackoverflow.com//questions/23000215

  •  20-12-2019
  •  | 
  •  

Вопрос

Я видел этот метод в образец изXamarin , используя JSON Доступ к серверу отдыха:

List<Country> countries = new List<Country>();
    public Task<List<Country>> GetCountries()
    {
        return Task.Factory.StartNew (() => {
            try {

                if(countries.Count > 0)
                    return countries;

                var request = CreateRequest ("Countries");
                string response = ReadResponseText (request);
                countries = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Country>> (response);
                return countries;
            } catch (Exception ex) {
                Console.WriteLine (ex);
                return new List<Country> ();
            }
        });
    }
.

Где «CreateReacest» и «ReadResponsetext» являются методами, которые взаимодействуют с сервером отдыха, в основном получают список стран для десериализации и возврата в список. Так что теперь я пытаюсь сделать этот метод универсальным, чтобы получить тип и вернуть универсальный список объектов указанного типа, что-то вроде этого:

public static Task<List<Object>> getListOfAnyObject(string requested_object, Type type) 
    {
        return Task.Factory.StartNew (() => {
            try {
                var request = CreateRequest (requested_object);
                string response = ReadResponseText (request);
                List<Object> objects = // create a generic list based on the specified type
                objects = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Object>> (response); // not sure how to handle this line
                return objects;
            } catch (Exception ex) {
                Console.WriteLine (ex);
                return ex.Message;
            }
        });
    }
.

Итак, мой вопрос, как я могу создать метод выше, чтобы использовать его более и меньше, как это (отливка списка на мой желаемый тип)?

List<Country> countries = (List<Country>)(List<?>) getListOfAnyObject("countries",Country.type);
.

Большое спасибо заранее!

Это было полезно?

Решение

Попробуйте что-то вроде этого ..

public static Task<List<T>> getListOfAnyObject<T>(string requested_object) 
{
   return Task.Factory.StartNew (() => {
       try {
           var request = CreateRequest (requested_object);
           string response = ReadResponseText (request);
           return Newtonsoft.Json.JsonConvert.DeserializeObject<List<T>> (response); // not sure how to handle this line
       } catch (Exception ex) {
           Console.WriteLine (ex);
           return ex.Message;
       }
   });
}
.

назвал так, как так ..

List<Country> countries = getListOfAnyObject<Country>("countries");
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top