【问题标题】:c# using generic methodc# 使用泛型方法
【发布时间】:2018-05-05 15:36:01
【问题描述】:

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

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

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

【问题讨论】:

  • 您的 client.Execute(request) 函数是否导致 response.Data 返回 UserXML 类型?介意分享一下 client.Execute 函数实现吗?
  • 我检查了它,他将 LoginXML 作为类型返回,这就是为什么但它会自动发生吗?没有什么可分享的,因为 client.Execute 来自 RestSharp:restsharp.org 抱歉,我的方法调用有错误,它应该是 UserXML user = req.Postrequest...

标签: c# generics restsharp


【解决方案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 对象,因此会出现错误。

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

【讨论】:

  • 谢谢!有没有其他方法可以解决它,比如重命名 T 什么的,我不太喜欢返回对象类型的想法
  • 我不确定这是否可行。您可能想为此创建一个新问题,看看是否有人知道任何更清洁的方法。
  • 也许可以做这样的事情.. public TRes PostRequest(string Ressource, TReq ObjTOPost) where TReq : new()
  • 这样,您可以根据自己的喜好定义请求和响应类型。其中 TReq 是 requestType 而 TRes 是返回/响应类型
  • 这可能是一个很好的参考stackoverflow.com/questions/30057636/…
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
相关资源
最近更新 更多