一种具有未指定数量的通用类型参数的方法

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

有没有办法在方法中使用未指定数量的通用类型参数?

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

    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
        }

    }

然而,这失败了,因为我需要使用Generic Type参数,例如T,而不是Type

但问题是,我不知道如何使用泛型以这种方式实现我想要实现的目标。因为我希望数组中的每个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();

有没有办法重新编码这种方法,以实现我的意图?

c# generics system.reflection
1个回答
2
投票

如果您可以在包装方法中使用反射,那么如下面的answer所述,您应该能够使用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 } }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.