运行时的多映射枚举

时间:2015-06-01 10:05:52

标签: c# enums

由于问题here被标记为重复,因此我在此重复提问并对该问题做出更多解释。希望有人能提出一些建议。 =======================================

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

public enum MyEnum {  One,  Two,  Three}

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

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

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

例如,上面的映射是在一个月前构建的,现在需要一些额外的项目,如下所示,这些新项目将只添加到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在运行时添加属性,是否可能?怎么样?

1 个答案:

答案 0 :(得分:0)

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

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

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