1

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

我正在寻找的是通过操作系统版本的变量 _type_ 限定:

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 类型的任何对象,但如果我必须这样做,并将其作为其他寻找相同对象的参考。

4

2 回答 2

3

否 - 条件编译在编译时工作,而看起来你正在寻找在执行时工作的东西。

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

于 2012-06-01T18:58:09.190 回答
2

回答:“我有一些丑陋的逻辑,我害怕当我暴露给别人时会被滥用”

考虑公开不会让任何误用的漂亮且可用的 API。将所有互操作类型声明为内部类和实现结构的好 API,使 REPASTESPECIAL 等最内部的类公开可见/可用并没有太大价值。

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

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

于 2012-06-01T20:48:28.107 回答