【问题标题】:Multi Mapping Enum at runtime运行时的多重映射枚举
【发布时间】:2015-06-01 10:05:51
【问题描述】:

由于问题here被标记为重复,所以在这里我重复问题并对该问题做更多解释。希望有人能给点建议。 =========================================

如问题中所述,这里是一个枚举:

public enum MyEnum {  One,  Two,  Three}

将基于mutl字符串进行解析。例如,下面的字符串都将被解析为MyEnum.Two:

"Two", "TWO", "Second", "2"

我不能直接利用描述属性或映射字典的原因是映射字符串来自外部 xml 文件。映射会在一段时间后发生变化,因此无法仅在上面声明的枚举中添加描述属性。

例如,上面的映射是一个月前构建的,现在需要一些额外的项目,如下所示,这些新项目将只是添加到 xml 文件中:

"2nd", "The Second one"

另外,我使用自己开发的脚本引擎来解析上面和其他类似的需求(这就是为什么我不使用简单的映射函数):

Object x = engine.Execute( /*some script codes defined in external xml*/ );
if (ReturnType.IsEnum && Enum.IsDefined(ReturnType, x)) //ReturnType is defined in external xml file
    return Enum.Parse(ReturnType, x.ToString());
else if (ReturnType.IsEnum)
{
    // Hope I can handle Extra mapping here
}
else
    return Convert.ChangeType(x, ReturnType);

将映射表传入上述代码似乎很奇怪,因为它是为通用脚本执行目的而设计的。所以我认为@xanatos(在prevous 'duplicated' question 中)提供了解决这个问题的方法,但是映射(通过自定义属性)应该在运行时生成。属性似乎是元数据,编译后无法更改,但是我发现一些帖子说我可以使用 TypeDescriptor 在运行时添加属性,可以吗?以及如何?

【问题讨论】:

  • 我重新打开了您的另一个问题,因为它不是重复的。我建议您编辑该问题以包含此处的更多详细信息,然后删除此问题。
  • 如果映射在未来没有改变,您可以使用自定义属性。可以更改实例的属性值,如此链接stackoverflow.com/a/51282/1305119 中所述。但它只会更改该实例的属性值,请参阅stackoverflow.com/a/10047350/1305119。您需要对所有实例重复此操作。在我看来,为您的案例使用自定义属性是不正确的方法。
  • 更好的方法是使用字典,其中键作为字符串,值作为枚举。从外部 xml 文件读取后,您可以填充此字典。当你想解析一个字符串时,你可以从字典中检索枚举值。这里唯一的问题是用作字典键的字符串区分大小写。
  • 我建议您将有关外部文件的信息添加到您的原始问题中。这会将解析问题转换为 ETL/集成问题 - 您必须在尝试解析外部数据之前对其进行清理。在这种情况下,任何需要的映射或替换都应该放在查找表或文件中,这样您就可以在输入更改时修改它们

标签: c# enums


【解决方案1】:

数据来自内容更改的外部文件这一事实使这成为 ETL/集成问题。在这种情况下,您必须在实际解析数据之前进行清理/规范化步骤。

在这种情况下,典型的解决方案是创建查找表,将输入映射到已识别的输出,并在解析之前将输入替换为查找值。事实上,像 SQL Server 的集成服务这样的 ETL 工具包括查找转换正是为了这个目的。

用查找数据替换传入数据后,您可以使用
Enum.TryParse (String, Boolean)Enum.TryParse(String, Boolean, TEnum)。这两种方法都允许您以不区分大小写的方式解析输入解析值或名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多