我有以下控制器(在图中)调用静态方法来获取数据。由于我将在许多其他页面上使用数据,我不想一次又一次地重新获取数据。这就是我检查数据是否为空然后正确返回值的原因。
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
)。
但是,在同样的方法中,我可以如何使用其他类型?
泛型是唯一的选择还是存在一些我可以使用的更好的设计/功能(不确定动态有多么有用)?
同样,如果我只留下泛型,我可以避免根据不同的类型编写代码吗?
答案 0 :(得分:2)
您的代码似乎有两部分可以更改:
MoviesListRootObject
)和结果的类型(例如IEnumerable<MovieDetails>
)泛型是#1的完美解决方案,但它们对#2没有多大帮助,你需要一些其他的机制。根据代码的结构,#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数据的一般代码与用于下载电影详细信息的特定代码分开。