在下面的示例中,是否可以动态设置Classname类型参数?
UpdateAndSave<Classname>>().Execute(sql)
答案 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 });