2

我有以下控制器(图中),它们调用静态方法来获取数据。由于我将在许多其他页面上使用数据,我不想一次又一次地请求数据。这就是为什么我要检查数据是否为空,然后适当地返回值。

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只有一种类型的反序列化(目前MoviesListRootObject如果我想转换为根对象的另一种类型:) FeaturedlistRootObject

但是我如何以同样的方法去渴望其他类型呢? 控制器示意图

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

同样,如果我只剩下泛型,我可以避免编写基于不同类型的代码吗?

4

1 回答 1

2

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

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

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

  1. 使方法通用并使用委托来创建结果
  2. 使整个类型通用并通过调用抽象方法创建结果

选择 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 数据的通用代码与下载电影细节的特定代码是分开的。

于 2012-09-07T12:33:14.967 回答