Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用泛型方法并在运行时设置泛型类型_C#_Asp.net Mvc_Generics - Fatal编程技术网

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

C# 调用泛型方法并在运行时设置泛型类型,c#,asp.net-mvc,generics,C#,Asp.net Mvc,Generics,在下面的示例中,是否可以动态设置Classname类型参数 UpdateAndSave<Classname>>().Execute(sql) UpdateAndSave>()。执行(sql) 您可以通过反射调用它,是的-用于提供类型参数: var method = typeof(Whatever).GetMethod("UpdateAndSave"); var genericMethod = method.MakeGenericMethod(typeArgument); ge

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

UpdateAndSave<Classname>>().Execute(sql)
UpdateAndSave>()。执行(sql)

您可以通过反射调用它,是的-用于提供类型参数:

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

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

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

运行时将检测
obj
的类型,确定要使用的最佳重载(即
Voodoo(…)
),并调用该重载。此外,它将缓存该类型的策略,因此下次速度很快(对于每个唯一类型,它只做一次重要的工作)。

如果该方法将实例作为参数,则有一个非常有趣的技巧;如果这是
UpdateAndSave(T theObject)
,那就很简单了——即使你不知道对象类型(即调用方只知道
object theObject
)。遗憾的是,你必须编写杂乱的反射代码来实现这一点,因为语言本身无法支持它。@DavidArno这种语言非常接近(见答案)@马奎尔先生,你是邪恶的!:)你更喜欢这个吗?@Brian:那是假设你有一个对象——如果你只有一个类型,它就不会工作。但两者都是可行的。
public void Voodoo<T>(T obj, string sql) {
    UpdateAndSave<T>().Execute(sql);
}
object obj = ...
Voodoo((dynamic)obj, sql);