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

时间:2014-08-08 22:16:40

标签: c# c++ generics

.NET Framework中有一种方法,它既包含泛型,也包含非泛型版本/重载。我想强制编译器使用非泛型版本生成我的代码,即使它可以在构建时解析泛型类型。

我想使用的具体方法是Marshal::GetFunctionPointerForDelegate,从.NET 4.5.1开始,它具有泛型重载。我想使用原始的(非通用的)。

此外,如果您可以在C ++ / CLI中提供解决方案(如果有的话),那么我们将非常感激。

更新:原因是,如果我的程序在没有.NET 4.5.1的计算机上运行,​​我的程序将崩溃。

2 个答案:

答案 0 :(得分:3)

从@elgonzo发布的源代码片段中可以清楚地看出,泛型版本正在调用非泛型版本,否则你会有无限递归。

因此,您也可以调用非泛型版本。诀窍是使非通用版本完美匹配。

C#:

Marshal.GetFunctionPointerForDelegate( (Delegate)(object) mydel );

C ++ / CLI:

Marshal::GetFunctionPointerForDelegate( dynamic_cast<Delegate^>(safe_cast<Object^>(mydel)) );

答案 1 :(得分:2)

使用 Marshall.GetFunctionPointerForDelegate 方法的泛型或非泛型变体并不重要。

Marshall.GetFunctionPointerForDelegate&lt; TDelegate&gt;(...)唯一的做法是调用非通用的Marshal.GetFunctionPointerForDelegate(...)方法。

从.NET框架reference source code可以看出, GetFunctionPointerForDelegate&lt; TDelegate&gt; 的实现只是:

public static IntPtr GetFunctionPointerForDelegate<TDelegate>(TDelegate d)
{
    return GetFunctionPointerForDelegate((Delegate)(object)d);
}

关于您的更新

  

更新:原因是,如果我的程序是在没有&gt;的计算机上运行的话。有.NET 4.5.1,我的程序会崩溃。

将项目的目标框架设置为4.5.1之前的.NET版本(例如,如果您的项目需要在.NET 3.5上运行,则将项目的目标框架设置为.NET 3.5。)