如何从这两种方法中组合出一种方法?

时间:2019-05-20 19:36:41

标签: c# generics

我对泛型非常陌生,但我遇到了一个问题,即两种方法本质上都做同样的事情。唯一的区别是参数。

我有一个带有很多JSON对象的json列表,并且我有两种方法以两种不同的方式获取不同的对象。该对象是由ID和代码组成的语言对象。

我试图深入研究泛型,因为我认为这是我可以解决此问题的方法,以使代码更加美观。但是,我很难理解它。

方法如下:

public LanguageDto GetLanguageById(int id)
{
    var o = JObject.Parse(json);
    var a = (JArray) o["list"];
    var _list = a.ToObject<IList<LanguageDto>>();

    return _list.FirstOrDefault(x => x.Id == id);
}

public LanguageDto GetLanguageByCode(string code)
{
    var o = JObject.Parse(json);
    var a = (JArray) o["list"];
    var _list = a.ToObject<IList<LanguageDto>>();

    return _list.FirstOrDefault(x => x.LanguageCode == code);
}

我想要的是一个看起来像这样的组合方法

public LanguageDto GetLanguage(T)
{
    var o = JObject.Parse(json);
    var a = (JArray) o["list"];
    var _list = a.ToObject<IList<LanguageDto>>();

    return _list.FirstOrDefault(x => x.T == T);
}

希望您能得到我的伪代码。

如果某人在泛型方面有很好的学习资源或解决了这个问题的东西,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

似乎您实际上只是在想一种方法来更改所使用的比较。我建议只是传递一个代表进行比较。

public LanguageDto GetLanguage(Func<LanguageDto, bool> isMatch)
{
    var o = JObject.Parse(json);
    var a = (JArray) o["list"];
    var _list = a.ToObject<IList<LanguageDto>>();

    return _list.FirstOrDefault(isMatch);
}

那时,您可以选择任何方式定义比较。

LanguageDto GetLanguageById(int id) => GetLanguage(x => x.Id == id);