十进制值/名称的枚举标志转换



我有几个枚举标志,它们表示外部系统的版本。我想确保,每次外部系统升级其版本时,我的功能都应该能够支持它(我会提前知道版本会升级,所以这是一项主动行动)。此外,我与这个系统的沟通必须是双向的,这意味着内部和外部沟通可以有不同的版本集。

我创建了一个枚举标志来表示这些版本。

[Flags]
public enum ExternalSystemVersionEnum
{
System1 = 1,
System2 = 2,
System3 = 4,
All = 7
}

这适用于正式的重大升级。遗憾的是,我不能把它们命名为System1.0等等。此外,作为它的小数,我不能使用通用枚举解析器。

(T) Enum.Parse(typeof (T), Convert.ToString(enumValue));

当然,我仍然可以通过使用开关/if语句来实现上述目标,但我真的想完全避免任何硬编码(如果可以的话,甚至是Resources/Contants),因为一个版本的外部系统可能会被完全丢弃,我不想为必须追查所有字符串而烦恼。

此外,我还需要标志或等效的功能,因为我仍然可能接收到没有系统版本标识的通信,默认情况下,该标识将转到适用于所有版本的。另一种通信可能仅适用于某些选定版本,例如仅适用于2.0以后的版本等。

请注意,我可以通过使用Switch/If轻松实现这一点,但我不希望有任何硬编码,除非没有其他(简单)方法。我在这里主要关心的是有一个功能,的作用类似于标志,但可以很容易地识别带小数点的值(比如1.0、1.2或1.3.1)(尽管在历史上它们从未有过双小数点),并提供编译时失败。我对其他机制的建议持开放态度,但我真的更希望它是一个简单的逻辑,因为它是整个过程中非常琐碎的部分。

怎么样

[Flags]
public enum ExternalSystemVersionEnum
{
System1_1 = 1,
System2_1 = 2,
System3_2 = 4,
All = 7
}
var enumString = decimalValue.ToString("0.0", 
CultureInfo.InvarantCulture).Replace('.', "_");
var enumValue = (ExternalSystemVersionEnum)Enum.Parse(
typeof(ExternalSystemVersionEnum), enumString);

听起来这些值可能会随着连接的系统以及连接的系统是否会升级而变化。为了删除硬编码并使其更加灵活,我建议将数据作为自定义节添加到app.config文件中。通过这种方式,您可以轻松地修改/添加/删除值,而无需每次更改都重新编译。

<configSections>
<section name="SystemVersions" type="YourAppName.SystemVersionSection, YourAppName" />
</configSections>
<SystemVersions>
<system version="1.0" />
<system version="2.0" />
<system version="1.3.1" />
<system version="All" />
</SystemVersions>

此CodeProject页面"懒惰编码器的自定义配置部分"可能会对您有所帮助。

我知道这不太符合您使用Enum的要求,但有时替代设计会更适合整体。

最新更新