![](/img/trans.png)
[英]Force C# compiler to use non-generic method overload with Linq Expression parameter
[英]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.