У меня есть несколько методов, каждый из которых возвращает объект.
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» - это переменная, но используется как тип. Если у вас есть опыт в этом вопросе и вы готовы помочь, я был бы признателен.
Вы почти там
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
- не лучшее название для типа.
лол, да, я просто назвал его так на этом сайте, чтобы скрыть свой настоящий код. :)
Последующий вопрос: я пытаюсь добавить попытку на случай, если что-то пойдет не так. Как я могу вернуть пустой объект «Т»? Я пробовал: T return = new T; но это дает мне ошибку.
@TheBigOnion - return default(T);
Спасибо за помощь. Я попробую.
Спасибо за помощь. Я попробую.
Вы должны удалить из параметров 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, спасибо, пропустил смотрел только по первым двум методам =)
@PoulBak Это вводящий в заблуждение комментарий. Проблема в том, как он используется позже, а не в том, как на него ссылаются как на параметр.