如何强制.net (c#)使用方法的非泛型重载?
本文关键字:泛型 重载 使用方法 何强制 net | 更新日期: 2023-09-27 18:17:06
. net框架中有一个方法同时具有泛型和非泛型版本/重载。我想强制编译器使用非泛型版本生成我的代码,即使它可以在构建时解析泛型类型。
我想使用的具体方法是Marshal::GetFunctionPointerForDelegate
,它在。net 4.5.1中具有泛型过载。我想用原来的那个(非通用的)
另外,如果您能提供c++/CLI的解决方案(如果有的话),我将不胜感激。
更新:这样做的原因是,如果我的程序在没有。net 4.5.1的计算机上运行,我的程序将崩溃。
从@elgonzo发布的源代码片段中应该可以清楚地看出,泛型版本正在调用非泛型版本,否则你将会有无限递归。
因此,您也可以调用非泛型版本。诀窍是使非泛型版本完美匹配。
c#:Marshal.GetFunctionPointerForDelegate( (Delegate)(object) mydel );
c++/CLI: Marshal::GetFunctionPointerForDelegate( dynamic_cast<Delegate^>(safe_cast<Object^>(mydel)) );
是否使用Marshall的泛型或非泛型变体并不重要。GetFunctionPointerForDelegate 方法。
marshal . getfunctionpointerfordelegate& lt;TDelegate>(…)所做的唯一事情是调用非泛型Marshal.GetFunctionPointerForDelegate(...)
方法。
可以从。net框架参考源代码中看到,GetFunctionPointerForDelegate
public static IntPtr GetFunctionPointerForDelegate<TDelegate>(TDelegate d)
{
return GetFunctionPointerForDelegate((Delegate)(object)d);
}
关于你的更新
更新:这样做的原因是,如果我的程序在一台没有。net 4.5.1的计算机上运行,我的程序将崩溃。
将项目的目标框架设置为4.5.1之前的。net版本(例如,如果您的项目需要在。net 3.5上运行,则将项目的目标框架设置为。net 3.5)