我有很少的枚举标记代表版本的外部系统。我想确保,每当外部系统升级其版本时,我的功能应该能够支持它(我事先会知道该版本将被升级,因此它是一个主动的行动)。此外,我的通信必须与此系统同时进行,这意味着内部和外部通信可以具有不同的版本集。
我创建了一个枚举标志来代表这些版本。
[Flags]
public enum ExternalSystemVersionEnum
{
System1 = 1,
System2 = 2,
System3 = 4,
All = 7
}
这适用于正式的重大升级。可悲的是,我不能将它们命名为System1.0等等。另外,作为小数,我不能使用通用枚举解析器。
(T) Enum.Parse(typeof (T), Convert.ToString(enumValue));
当然我仍然可以通过使用 switch / if语句来实现上述目标,但我真的想完全避免任何硬编码(即使是资源/包含,如果我可以),因为外部系统的一个版本可能被完全丢弃,我不想为必须追查所有字符串而烦恼。
此外,我还需要标志或等效功能,因为我仍然可能会收到没有系统版本标识的通信,默认情况下会转到适用于所有版本。另一种通信可能仅适用于某些选择版本,例如。仅适用于2.0以上等。
请注意,我可以通过使用Switch / If轻松实现此目的,但我不希望有任何硬编码,除非没有其他(简单)方法。我主要担心的是具有像标志那样的功能,但很容易识别带小数位的值,比如1.0或1.2或1.3.1(尽管在历史他们从来没有双小数点),并提供编译时失败。我对其他机制的建议持开放态度,但我真的更喜欢它是一个简单的逻辑,因为它是整个过程中非常重要的一部分。
答案 0 :(得分:2)
怎么样?
[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);
答案 1 :(得分:1)
听起来这些值可能会发生变化,具体取决于连接的系统以及连接的系统是否会升级。为了删除硬编码并使其更加灵活,我建议您将数据添加为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页面Custom Configuration Sections for Lazy Coders可能会对您有所帮助。
我知道这并不适合您使用Enum的要求,但有时候替代设计会更适合整体。