繁体   English   中英

具有不确定数量的泛型类型参数的方法

[英]A method with an unspecified number of Generic Type parameters

有没有一种方法可以使用方法中未指定数量的泛型类型参数?

实际上,除了明显的问题外,我想做的是这样的事情:

    private static void FetchChunk(int retries, KeyValuePair<List<dynamic>,Type>[] fetchfields)
    {
        try
        {
            foreach (var chunk in fetchfields)
            {
                var obj = chunk.Key;
                obj = DBRepository.GetAll<chunk.Value>().ToList();
            }
        }
        catch
        {
            //do stuff
        }

    }

但是,这失败了,因为我需要使用通用类型参数(例如T)代替类型,

但是问题是,我不知道如何以这种方式使用泛型来实现我要实现的目标。 因为我想要数组中每个KeyValuePair的唯一通用类型参数。

另一方面,这绝对可以编译,但是并不能满足我的预期,因为每个KeyValue对都具有自己的唯一Generic Type参数。

    private static void FetchChunk<T>(int retries, KeyValuePair<List<dynamic>, T>[] fetchfields)
    {
        try
        {
            foreach (var chunk in fetchfields)
            {
                var obj = chunk.Key;
                obj = DBRepository.GetAll<T>().ToList();
            }
        }
        catch
        {
            //do stuff
        }

GetAll的方法签名为

 public static IEnumerable<dynamic> GetAll(Type type, string columnNames = "*")

这也不起作用:

                var type = chunk.Value.GenericTypeArguments[0];
                obj = DBRepository.GetAll<type>().ToList();

有没有一种方法可以重新编码此方法以实现我的意图?

如果可以在包装方法中使用反射,则如以下答案中所述,您应该能够使用MakeGenericMethod构造通用方法的实例,然后使用不同的类型集进行调用。

代码已更新,以匹配@AlexanderRyanBaggett的最新评论

private static void FetchChunk(int retries, KeyValuePair<List<dynamic>, Type>[] fetchfields)
{
    try
    {
        foreach (var chunk in fetchfields)
        {
            var method = typeof(DBRepository).GetMethod("GetAll");
            var Generic = method.MakeGenericMethod(chunk.Value);
            chunk.Key.AddRange(Generic.Invoke(null, null) as IEnumerable<dynamic>);
        }
    }
    catch
    {
        //do stuff } }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM