如何强制.net (c#)使用方法的非泛型重载?

本文关键字:泛型 重载 使用方法 何强制 net | 更新日期: 2023-09-27 18:17:06

. net框架中有一个方法同时具有泛型和非泛型版本/重载。我想强制编译器使用非泛型版本生成我的代码,即使它可以在构建时解析泛型类型。

我想使用的具体方法是Marshal::GetFunctionPointerForDelegate,它在。net 4.5.1中具有泛型过载。我想用原来的那个(非通用的)

另外,如果您能提供c++/CLI的解决方案(如果有的话),我将不胜感激。

更新:这样做的原因是,如果我的程序在没有。net 4.5.1的计算机上运行,我的程序将崩溃。

如何强制.net (c#)使用方法的非泛型重载?

从@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)