当我想在我的类/方法中使用不同的类型时,是否有蚂蚁设计解决方案而不是泛型

时间:2012-09-07 11:29:19

标签: c# generics .net-4.0

我有以下控制器(在图中)调用静态方法来获取数据。由于我将在许多其他页面上使用数据,我不想一次又一次地重新获取数据。这就是我检查数据是否为空然后正确返回值的原因。

private static IEnumerable<MovieDetails> GetJsonData(string jsonRequestURL)
{
    try
    {
        using (var wc = new WebClient())
        {
            var json = wc.DownloadString(jsonRequestURL);
            var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json);

            var responseObject = rootObj.movieResponse;

            var movieDetails = responseObject.Select(movieDetail =>
                                                        new MovieDetails
                                                        {
                                                            Description = movieDetail.description,
                                                            MovieURI = movieDetail.formats.res150p,
                                                            Thumbnail = movieDetail.image,
                                                            Title = movieDetail.title,
                                                            ID = movieDetail.id
                                                        });
            return movieDetails;
        }
    }

    catch (Exception exception)
    {
        //Error Handling
    }
}

这是完美的,直到GetJsonData Desrializng只有一种类型(当前MoviesListRootObject如果我想转换为Root对象的另一种类型ex FeaturedlistRootObject)。

但是,在同样的方法中,我可以如何使用其他类型? Diagram of controllers

泛型是唯一的选择还是存在一些我可以使用的更好的设计/功能(不确定动态有多么有用)?

同样,如果我只留下泛型,我可以避免根据不同的类型编写代码吗?

1 个答案:

答案 0 :(得分:2)

您的代码似乎有两部分可以更改:

  1. 根对象的类型(例如MoviesListRootObject)和结果的类型(例如IEnumerable<MovieDetails>
  2. 如何从根对象
  3. 创建结果

    泛型是#1的完美解决方案,但它们对#2没有多大帮助,你需要一些其他的机制。根据代码的结构,#2的最佳解决方案可能会有所不同。我认为你在这里有两个选择:

    1. 使方法通用并使用委托创建结果
    2. 使整个类型通用并通过调用抽象方法创建结果
    3. 选择1看起来像这样:

      private static TResult GetJsonData<TRoot, TResult>(
          string jsonRequestURL, Func<TRoot, TResult> resultSelector)
      {
          using (var wc = new WebClient())
          {
              var json = wc.DownloadString(jsonRequestURL);
              var rootObj = JsonConvert.DeserializeObject<TRoot>(json);
              return resultSelector(rootObj);
          }
      }
      
      private static IEnumerable<MovieDetails> GetMovieDetails(string jsonRequestURL)
      {
          return GetJsonData<MoviesListRootObject, IEnumerable<MovieDetails>>(
              jsonRequestURL,
              rootObj =>
              {
                  var responseObject = rootObj.movieResponse;
      
                  var movieDetails = responseObject.Select(
                      movieDetail =>
                          new MovieDetails
                          {
                              Description = movieDetail.description,
                              MovieURI = movieDetail.formats.res150p,
                              Thumbnail = movieDetail.image,
                              Title = movieDetail.title,
                              ID = movieDetail.id
                          });
                  return movieDetails;
              });
      }
      

      这样,下载JSON数据的一般代码与用于下载电影详细信息的特定代码分开。