基于操作系统版本的C#条件编译变量

时间:2012-06-01 18:52:24

标签: c# variables struct operating-system conditional-compilation

首先,是的,我看过这些帖子:
Is there an easy way in C# to have conditional compilation symbols based on OS version
Conditional compilation depending on the framework version in C#
但他们没有针对我正在寻找的方向。

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

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对象时,允许程序员使用Type T的任何对象,但是如果我必须那么这样做,并将其作为其他人寻找的参考同样的。

2 个答案:

答案 0 :(得分:3)

否 - 条件编译在编译时有效,而看起来你正在处理执行时的工作。

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

答案 1 :(得分:2)

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

考虑公开不会滥用的优质且可用的API。将所有互操作类型声明为内部类和实现结构,这是很好的API,没有太多价值可以使像REPASTESPECIAL这样的内部类公开可见/可用。

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

如果是这个教育项目 - 那么它是了解dependency injection在运行时配置正确实现的好地方。