c#使用通用方法

时间:2018-05-05 15:36:02

标签: c# generics restsharp

我想知道如何解决以下问题:

我有一个返回响应数据的通用方法。

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;
    }
}

当我像这样调用Method时,它说LoginXML无法转换为UserXML。我不明白为什么因为LoginXML是一个参数,仅用于为post请求序列化我的属性。

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 :(得分:1)

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对象,因此会出错。

一种方法是简单地返回对象,但是它需要转换每个对象的麻烦,并且会有可能导致异常的错误转换。