运行时的多映射枚举

本文关键字:枚举 映射 运行时 | 更新日期: 2023-09-27 17:51:17

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

如问题所述,这是一个enum:

public enum MyEnum {  One,  Two,  Three}

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

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

我不能直接利用描述属性或映射字典的原因是映射字符串来自外部xml文件。映射将在一段时间后发生变化,因此不可能仅使用上述声明的enum添加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(在之前的"复制"问题中)给出了一种解决这个问题的方法,但是映射(通过自定义属性)应该在运行时生成。属性似乎是一个元数据,不能在编译后改变,然而,我发现一些帖子说,我可以使用TypeDescriptor在运行时添加属性,这是可能的吗?以及如何?

运行时的多映射枚举

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

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

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