【问题标题】:Return generic object type返回通用对象类型
【发布时间】:2017-01-21 00:49:41
【问题描述】:

我们在GitHub Gist上的完整代码我只包括我认为需要显示问题的部分。

执行方法:

  public object Execute()
        {
            var request = createWebRequest();
            request.Method = this.Method;
            applyPostData(ref request);

            request.ContentType = "application/json";
            request.UserAgent = "generic-http-dotnet-client/3.5/v1 (gzip)";

            var response = (HttpWebResponse)request.GetResponse();

            var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

            try
            {
                return JsonConvert.DeserializeObject(responseString);
            }
            catch (Exception)
            {
                return new HttpResponse { message = responseString };
            }
        }

好的,这很有效。但是,我希望能够在调用该方法后将其转换为适当的对象类型。

var response = (MetaDataResponse)request.Execute();

我知道应该有某种方式可能使用泛型(疯狂猜测)让我对响应进行 json DeserializeObject 并返回它?

我最终将执行方法的返回类型更改为字符串,并执行此操作。

public class MetaDataRequest : HttpRequestBase
    {
        public MetaDataResponse MetaDataItems { get; private set; }

        public MetaDataRequest() : base(new Uri("https://www.googleapis.com/analytics/v3/metadata/ga/columns"), "GET")
        {
            this.addParameter("key", "xxxx");
            var response = this.Execute();

            try
            {
                MetaDataItems =  JsonConvert.DeserializeObject<MetaDataResponse>(response);
            }
            catch (Exception)
            {
                var resultsx = new HttpResponse { message = response };
            }
        }
    }

这很有效,但对我来说很乱。请注意,该项目是 .Net framework 3.5,我无法更改。随意添加您能想到的任何其他标签。

【问题讨论】:

  • 我不会在生产中使用这样的代码...看起来真的很笨拙。
  • 我认为您可以向HttpRequestBase 添加一个类型参数,例如HttpRequestBase&lt;T&gt; 并使用JsonConvert.DeserializeObject&lt;T&gt;(responseString) 并返回T 类型
  • 同意#2。反序列化仅提供该功能。也可以试试这个,以了解更多关于此事的信息:stackoverflow.com/questions/6626315/…
  • @JeremyHolovacs 我是界面新手,如果您有任何其他想法,很高兴学习

标签: c# generics .net-3.5


【解决方案1】:

首先,要点不是处理它的 IDisposables,这很草率。我会推荐这样的东西:

public T Execute<T>()
    {
        var request = createWebRequest();
        request.Method = this.Method;
        applyPostData(ref request);

        request.ContentType = "application/json";
        request.UserAgent = "generic-http-dotnet-client/3.5/v1 (gzip)";

        using(var response = (HttpWebResponse)request.GetResponse())
        using(var stream = response.GetResponseStream())
        using(var reader = new StreamReader(stream))
        {
            try
            {
                var responseString = reader.ReadToEnd();
                return JsonConvert.DeserializeObject<T>(responseString);
            }
            catch (Exception ex)
            {
                //log something with ex
                return default(T);
            }
        }
    }

【讨论】:

  • 您的权利。我真的应该养成使用 IDisposables 的习惯。
  • 顺便说一句:我不得不稍微改变一下我得到“在 using 语句中使用的字符串类型必须隐式转换为 System.idisposable。”。只需使用 streamReader 然后将其读入 Json 就可以很好地工作
【解决方案2】:

对 MetaDataRequest 类使用泛型

class MetadataRequest<T>:HttpRequestBase
{
    public T Execute()
    {
        var request = createWebRequest();
        request.Method = this.Method;
        applyPostData(ref request);

        request.ContentType = "application/json";
        request.UserAgent = "generic-http-dotnet-client/3.5/v1 (gzip)";

        var response = (HttpWebResponse)request.GetResponse();

        var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

        return JsonConvert.DeserializeObject<T>(responseString);
    }
}

然后,要获取对象,您可以像这样调用方法:

MetadataResponse responseObject = (new MetadataRequest<MetadataResponse>()).Execute();

在这种情况下,您可以捕获 .Execute() 抛出的异常,因为它只能返回 null 或 T 类型的实例。

编辑:您也可以按照Jeremy Holovacs' answer 使用泛型方法。

【讨论】:

  • 那行得通。如果我理解这一点,类名的 会告诉它返回类型是什么?
  • 是的,没错。这就是通用类和库的实现方式,允许调用者选择返回类型。
  • 在过去的两周里,我一直在努力研究仿制药。我想我快到了。这是我自己做的第一件事,没有从别人的教程中应对。我不知道我是怎么在没有他们的情况下生活了这么长时间的。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多