具有未指定数量的通用类型参数的方法
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 对都有自己独特的通用类型参数。
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();
有没有办法重新编码此方法以实现我的意图?
如果您可以在包装方法中使用反射,那么如下所述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 } }
}
}
有没有办法在方法中使用未指定数量的通用类型参数?
除了明显的问题外,实际上我想做的是这样的事情:
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 对都有自己独特的通用类型参数。
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();
有没有办法重新编码此方法以实现我的意图?
如果您可以在包装方法中使用反射,那么如下所述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 } }
}
}