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

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» - это переменная, но используется как тип. Если у вас есть опыт в этом и вы готовы помочь, я был бы признателен.

1
TheBigOnion 13 Сен 2018 в 18:36

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 - не лучшее название для типа.

5
Igor 13 Сен 2018 в 15:38

Вы должны удалить из параметров 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;
  }
}
1
Guru Stron 13 Сен 2018 в 15:50