C# 将操作系统表示为枚举

C# 将操作系统表示为枚举,c#,enums,C#,Enums,我希望在我们的自动化测试框架中增加一种能力,让测试编写者能够用表示测试支持的最低OS版本的属性来标记他们的测试方法。例如,测试编写者会标记一个测试方法支持WindowsVista SP1和更高版本,然后框架就会知道如何在Vista、7等上运行测试 我的直觉是使用枚举来表示,例如OS.VistaSp1、OS.Win7等。但由于我们还支持多种操作系统类型,Mac、Linux等。枚举不足以让框架了解最小值是多少。例如,它不容易知道OS.Win7高于OS.VistaSp1,但与OS.MacOsX无关 我

我希望在我们的自动化测试框架中增加一种能力,让测试编写者能够用表示测试支持的最低OS版本的属性来标记他们的测试方法。例如,测试编写者会标记一个测试方法支持WindowsVista SP1和更高版本,然后框架就会知道如何在Vista、7等上运行测试

我的直觉是使用枚举来表示,例如OS.VistaSp1、OS.Win7等。但由于我们还支持多种操作系统类型,Mac、Linux等。枚举不足以让框架了解最小值是多少。例如,它不容易知道OS.Win7高于OS.VistaSp1,但与OS.MacOsX无关

我的下一个想法是,我可以使用枚举的低位来表示操作系统类型,用高位来表示[相对]版本号,这将解决这个问题。它不是最干净的,但是使用它的测试编写者根本不需要知道这一点,并且只需要少量代码来解析信息,这些信息都可以封装在某个Utils类中

对这个问题有什么想法吗?这是一个干净的解决方案吗?有更好的解决办法吗?
谢谢

对此,我将至少使用两个不同的变量:

通用操作系统类型Windows、Linux、MacOS-枚举非常适合于此 service pack/版本信息可以是一个字符串,甚至可以是两个单独的字符串,例如XP SP3和5.3.157* 这有两个好处:

更容易对操作系统版本进行排序并确定兼容性问题, 至少service pack版本可以跨操作系统重用,因此您可以减少所需枚举值的数量。
*不是真正的XP版本号,只是示例

当您需要更多功能时,可以以类似于枚举的方式使用结构。声明一组静态只读字段,这些字段是结构的实例,可以像一组枚举值一样使用,但switch语句中除外:

public struct OSVersion
{
    public readonly string Name;
    public readonly Version Version;

    public OSVersion( string name, Version version )
    {
        Name = name;
        Version = version;
    }

    public static readonly OSVersion WindowsXPSP3 = new OSVersion( "XP SP3", new Version(...) );
    public static readonly OSVersion WindowsVistaSP1 = new OSVersion( "Vista SP1", new Version(...) );
    public static readonly OSVersion Windows7 = new OSVersion( "Win7", new Version(...) );
}

显然,您需要在这里做更多的工作,比如可能添加更多的字段和重载一些运算符,这里必须使用相等运算符,但是,这在许多方面与枚举类似,但提供了更多的功能。

我会编写一个操作系统枚举,并使用版本对象作为第二个参数。

是否不可能使用现有的Environment.OperatingSystem类

对于平台id,它包含MacOSX、Unix、Win32 S、Win32 NT、Win32 Windows、WinCE和XBox。 它还包含service pack的字符串和提供版本号的版本对象


我不知道它能自动检测到这些,我猜mono支持很多,因为我自己从来没有尝试过。

非常确定不能在属性中使用OperatingSystem类,可以吗?可以编写一个属性,在构造函数中接受OperatingSystem作为参数。唯一的问题是无法在ctor中输入service pack字符串。只有平台id和版本。如果是,则可以,虽然我更喜欢我的解决方案的一点是,我可以很容易地收集所有现有版本,当查找大于x的所有版本时,我只需查看枚举,不需要单独的数据…我考虑过这一点,但我的问题是,我需要将系统支持的所有版本存储在某个地方,因为我需要为每个受支持的版本生成测试数据。我喜欢我的解决方案的一点是,数据实际上是在枚举中定义的,而不是单独的XML文件或类似的东西……我非常喜欢这一点,但请纠正我,如果我错了,请不要认为您这样声明const,因为它们需要是编译时常量,属性也是如此……对不起,您是对的;它们必须是静态只读字段,就像我最初在那里看到的一样。是的,这就是我害怕的,这意味着我不能将它们用作属性的参数……没问题,感谢您的帮助:我有点太激动了,无法向别人展示如何使用structs作为一种“强大的枚举”,我完全忽略了您的一个需求:D