Как передать и использовать общий объект в с #?

У меня есть несколько методов, каждый из которых возвращает объект.

public objA myCall(string[] args)
{           
    webAPI myAPI = new webAPI();
    returnData = myAPI.callApi("http://localhsot/api", args , "POST");

    XmlSerializer serializer = new XmlSerializer(typeof(myObj));

    using (TextReader reader = new StringReader(returnData))
    {
        objA result = (objA)serializer.Deserialize(reader);

        return result;
    }
}

А также

public objB myCall(string[] args)
{           
  webAPI myAPI = new webAPI();
  returnData = myAPI.callApi("http://localhsot/api", args , "POST");

  XmlSerializer serializer = new XmlSerializer(typeof(myObj));

  using (TextReader reader = new StringReader(returnData))
  {
      objB result = (objB)serializer.Deserialize(reader);

      return result;
  }
}

Я хотел бы объединить их в один метод, используя дженерики. Таким образом я могу передать объект, который хочу вернуть. Я никогда раньше не использовал дженерики и нуждаюсь в небольшой помощи. Вот что я пробовал:

public T myCall<T>(ref T myObj, string[] args)
{           
  webAPI myAPI = new webAPI();
  returnData = myAPI.callApi("http://localhsot/api", args , "POST");

  XmlSerializer serializer = new XmlSerializer(typeof(myObj));

  using (TextReader reader = new StringReader(returnData))
  {
      myObj result = (myObj)serializer.Deserialize(reader);

      return result;
  }
}

Но когда я помещаю это в Visual Studio, я получаю сообщение об ошибке, в котором говорится, что «myObj» - это переменная, но используется как тип. Если у вас есть опыт в этом вопросе и вы готовы помочь, я был бы признателен.

@PoulBak Это вводящий в заблуждение комментарий. Проблема в том, как он используется позже, а не в том, как на него ссылаются как на параметр.

Reinstate Monica Cellio 13.09.2018 17:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы почти там

public T myCall<T>(string[] args)
{           
  webAPI myAPI = new webAPI();
  returnData = myAPI.callApi("http://localhsot/api", args , "POST");

  XmlSerializer serializer = new XmlSerializer(typeof(T));

  using (TextReader reader = new StringReader(returnData))
  {
      T result = (T)serializer.Deserialize(reader);

      return result;
  }
}

А затем вы вызываете его, передавая тип как общее ограничение.

var result = myCall<objA>(someArguments);

Кстати (а также мое мнение) objA - не лучшее название для типа.

лол, да, я просто назвал его так на этом сайте, чтобы скрыть свой настоящий код. :)

TheBigOnion 13.09.2018 17:46

Последующий вопрос: я пытаюсь добавить попытку на случай, если что-то пойдет не так. Как я могу вернуть пустой объект «Т»? Я пробовал: T return = new T; но это дает мне ошибку.

TheBigOnion 20.09.2018 20:26

@TheBigOnion - return default(T);

Igor 20.09.2018 20:28

Спасибо за помощь. Я попробую.

TheBigOnion 20.09.2018 22:15

Спасибо за помощь. Я попробую.

TheBigOnion 20.09.2018 22:15

Вы должны удалить из параметров myObj и изменить его в теле метода на T следующим образом

public T myCall<T>(string[] args)
{           
  webAPI myAPI = new webAPI();
  returnData = myAPI.callApi("http://localhsot/api", args , "POST");

  XmlSerializer serializer = new XmlSerializer(typeof(T));

  using (TextReader reader = new StringReader(returnData))
  {
      T result = (T)serializer.Deserialize(reader);

      return result;
  }
}

@Igor, спасибо, пропустил смотрел только по первым двум методам =)

Guru Stron 13.09.2018 17:50

Другие вопросы по теме