C # с использованием универсального метода - PullRequest
0 голосов
/ 05 мая 2018

Я хотел бы знать, как я могу решить следующую проблему:

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

public class Request
{
    public T PostRequest<T>(string Ressource, T ObjTOPost) where T : new()
    {
        var request = new RestRequest(Ressource, Method.POST);

        var client = new RestClient("https://api.net/api/v1/");

        request.XmlSerializer = new RestSharp.Serializers.XmlSerializer();
        request.RequestFormat = DataFormat.Xml;

        request.AddXmlBody(ObjTOPost, "http://api.net");
        var response = client.Execute<T>(request);

        return response.Data;
    }
}

Когда я вызываю такой метод, он говорит, что LoginXML не может быть преобразован в UserXML. Я не понимаю, почему, поскольку LoginXML является параметром только для сериализации моих свойств для запроса на публикацию.

var login = new LoginXML();
        login.username = tbUsername.Text;
        login.password = tbPassword.Text;

Request req = new Request();
UserXML user = req.PostRequest("sessions", login);

Вот мои LoginXML и UserXML

 [SerializeAs(Name = "login")]
public class LoginXML
{
    private string user;
    private string pw;
    private string ID;

    [DeserializeAs(Name = "id")]
    public string sessionID { get; set; }
    [SerializeAs(Name = "username")]
    public string username
    {
        get
        {
            return this.user;
        }
        set
        {
            this.user = value.Trim();
        }
    }
    [SerializeAs(Name = "password")]
    public string password
    {
        get { return this.pw; }
        set { this.pw = value.Trim(); }
    }
}

public class UserXML
{
    private string ID;

    [DeserializeAs(Name = "id")]
    public string sessionID {get;set;}
}

1 Ответ

0 голосов
/ 05 мая 2018
public T PostRequest<T>(string Ressource, T ObjTOPost) where T : new()

Ваш PostRequest тип возврата - T, что аналогично T ObjTOPost. Так как вы передали LoginXML экземпляр в req.PostRequest("sessions", login);, он бы предположил, что ваш возвращаемый тип также будет LoginXML, так как они оба T.

public T PostRequest<T>(string Ressource, T ObjTOPost) where T : new()
{
    // Some code
    return response.Data;
}

Здесь вы пытаетесь вернуть данные, полученные из вашего запроса на отдых, тип UserXML. Однако в этом случае тип возвращаемого вами метода - LoginXML, но вместо этого вы возвращаете объект UserXML, отсюда и ошибка.

Один из способов - просто вернуть объект, но это требует трудностей приведения каждого объекта, и будут потенциально неправильные приведения, которые вызывают исключения.

...