繁体   English   中英

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

[英]How Can I Force .NET (C#) to Use the non-generic overload of a method?

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

我要使用的特定方法是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方法的泛型或非泛型变量并不重要。

Marshall.GetFunctionPointerForDelegate <TDelegate>(...)唯一要做的就是调用非通用的Marshal.GetFunctionPointerForDelegate(...)方法。

从.NET框架参考源代码中可以看出, GetFunctionPointerForDelegate <TDelegate>的实现只是:

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。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM