如何通过方法传递和使用泛型类型?

问题描述 投票:0回答:1

就DRY原则而言,我正在寻求减少以下方法(还有其他列表需要生成,所以现实生活中数量更大):

public static List<Genre> GetGenres(ApiCredentials apiCredentials = null, ApiServerParameters apiServerParameters = null)
{
    List<Genre> returns = new List<Genre>();

    GetData getData = new GetData(apiCredentials, apiServerParameters);
    var outcome = getData.GetListOrInfo(Enums.ApiQueryType.GenreList);

    XDocument xdoc = XDocument.Parse(outcome.Data.ToString());
    
    foreach (var genre in xdoc.Descendants("genre"))
    {
        returns.Add(new Genre(genre));
    }       

    return returns;
}

public static List<Language> GetLanguages(ApiCredentials apiCredentials = null, ApiServerParameters apiServerParameters = null)
{
    List<Language> returns = new List<Language>();

    GetData getData = new GetData(apiCredentials, apiServerParameters);
    var outcome = getData.GetListOrInfo(Enums.ApiQueryType.LanguageList);

    XDocument xdoc = XDocument.Parse(outcome.Data.ToString());

    foreach (var language in xdoc.Descendants("langue"))
    {
        returns.Add(new Language(language));
    }

    return returns;
}

我已经弄清楚如何传递泛型

T
,但无法弄清楚如何引发类型
T
的新实例:

public static List<T> GetList<T>(Enums.ApiQueryType queryType, string xElementName,
    ApiCredentials apiCredentials = null, ApiServerParameters apiServerParameters = null)
{

    List<T> returns = new List<T>();

    GetData getData = new GetData(apiCredentials, apiServerParameters);
    var outcome = getData.GetListOrInfo(queryType);

    XDocument xdoc = XDocument.Parse(outcome.Data.ToString());

    foreach (var element in xdoc.Descendants("genre"))
    {
        returns.Add(new T(element)); /// Doesn't compile
    }

    return null;
}

我该怎么做?

c# list types instance
1个回答
0
投票

要么在 T 的构造函数上添加约束,要么使用 reflection 检索 T 的构造函数,该构造函数具有您要传递的类型的一个参数。

© www.soinside.com 2019 - 2024. All rights reserved.