调用泛型方法并在运行时设置泛型类型

时间:2013-11-07 11:21:15

标签: c# asp.net-mvc generics

在下面的示例中,是否可以动态设置Classname类型参数?

UpdateAndSave<Classname>>().Execute(sql)

2 个答案:

答案 0 :(得分:7)

如果您的类型来自一个对象,那么您可以使用dynamic作弊 - 劫持它以执行(并通过元编程等缓存)类型解析。例如 - 如果您目前有:

object obj = ...
Type type = obj.GetType();
// now want to call UpdateAndSave<type>(...)

然后你可以这样做:

public void Voodoo<T>(T obj, string sql) {
    UpdateAndSave<T>().Execute(sql);
}

而且只是:

object obj = ...
Voodoo((dynamic)obj, sql);

运行时将检测obj的类型,确定要使用的最佳重载(将为Voodoo<TheActualType>(...)),调用。此外,它将缓存该类型的策略,因此下次速度很快(每个唯一类型只执行一次重要工作)。

答案 1 :(得分:4)

你可以通过反射调用它,是的 - 使用MethodInfo.MakeGenericMethod来提供类型参数:

var method = typeof(Whatever).GetMethod("UpdateAndSave");
var genericMethod = method.MakeGenericMethod(typeArgument);
genericMethod.Invoke(target, new object[] { sql });