gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:17:12 25 4
gpt4 key购买 nike

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

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 如果我想转换为另一种类型的 Root 对象,例如:FeaturedlistRootObject )。

但是如何在同一个方法中反演其他类型呢? Diagram of controllers

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

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

最佳答案

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

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

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

  1. 使方法通用并使用委托(delegate)来创建结果
  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数据的通用代码和下载电影详情的具体代码就分离了。

关于c# - 当我想在我的类/方法中使用不同的类型时,是否有 Ant 设计解决方案而不是泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12317244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com