首先,是的,我看过这些帖子:
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的任何对象,但是如果我必须那么这样做,并将其作为其他人寻找的参考同样的。
答案 0 :(得分:3)
否 - 条件编译在编译时有效,而看起来你正在处理执行时的工作。
编辑:只是考虑一下,你可以在一个意义上使用条件编译:你可以在它自己的程序集中尽可能地封装它,并以两种方式编译它,产生两个独立的程序集。然后在安装时(或其他)安装正确的组件。如果不知道你正在写什么类型的应用程序,很难知道它是多么可行。答案 1 :(得分:2)
回答:“我有一些丑陋的逻辑,当我把它暴露给别人时,我害怕会被滥用”
考虑公开不会滥用的优质且可用的API。将所有互操作类型声明为内部类和实现结构,这是很好的API,没有太多价值可以使像REPASTESPECIAL这样的内部类公开可见/可用。
这样,您可以隐藏丑陋的类/结构类型,并根据需要动态选择特定于操作系统的实现。
如果是这个教育项目 - 那么它是了解dependency injection在运行时配置正确实现的好地方。