基于 OS 版本的 C# 条件编译变量

本文关键字:条件 编译 变量 OS 版本 基于 | 更新日期: 2023-09-27 18:36:07

首先,是的,我看过这些帖子:
C# 中是否有一种简单的方法可以基于操作系统版本
使用条件编译符号取决于 C#
中的框架版本的条件编译但它们没有针对我正在寻找的方向。

我特别要寻找的是通过操作系统版本的变量_类型_限定

public struct REPASTESPECIAL
{
     UInt32   dwAspect;
#if WINVER >= 6.0
     UIntPtr  dwParam;
#else
     UInt32   dwParam;
#endif 
}

我不想恢复到这样的事情:

public struct REPASTESPECIAL<T>
{
     UInt32     dwAspect;
     T dwParam;
}
// return type by OS version
public static Type GetRePasteSpecial_ParamType()
{
    if (Environment.OSVersion.Version.Major >= 5) return typeof(IntPtr);
    else return typeof(UInt32);
}

。因为当我希望 dwParam 仅是 IntPtr 或 UInt32 对象时,这将允许程序员使用任何类型 T 的对象,但如果必须如此,那就这样吧,并将其作为其他人寻找相同内容的参考。

基于 OS 版本的 C# 条件编译变量

否 - 条件编译在编译时工作,而看起来你追求的是执行时工作的东西。

编辑:只是考虑一下,你可以在一种意义上使用条件编译:你可以尽可能地将其封装在它自己的程序集中,并以两种方式编译它,生成两个单独的程序集。然后在安装时(或其他什么)安装正确的组件。但是,如果不知道您正在编写哪种应用程序,就很难知道这有多可行。

回答:"我有一些丑陋的逻辑,我担心当我把它暴露给别人时会被滥用"

考虑公开漂亮且可用的API,它不允许任何滥用。将所有互操作类型声明为内部类和实现结构,如果你是很好的API,使像REPASTESPECIAL这样的最内部类成为公开可见/可用的没有多大价值。

通过这种方式,您可以隐藏丑陋的类/结构类型,并在需要时动态选择特定于操作系统的实现。

如果这个教育项目 - 那么它将是学习依赖关系注入以在运行时配置正确实现的好地方。