C# 运行时的多重映射枚举

C# 运行时的多重映射枚举,c#,enums,C#,Enums,由于问题被标记为重复,所以我在这里重复问题,并对问题进行更多解释。希望有人能给点建议。 ======================================= 如问题所述,以下是一个枚举: public enum MyEnum { One, Two, Three} 将基于mutl字符串解析。例如,以下字符串都将解析为MyEnum。两个: "Two", "TWO", "Second", "2" 我不能直接利用描述属性或映射字典的原因是映射字符串来自外部xml文件。映射将在一段时间

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

如问题所述,以下是一个枚举:

public enum MyEnum {  One,  Two,  Three}
将基于mutl字符串解析。例如,以下字符串都将解析为MyEnum。两个:

"Two", "TWO", "Second", "2"
我不能直接利用描述属性或映射字典的原因是映射字符串来自外部xml文件。映射将在一段时间后更改,因此不可能仅使用上述声明的枚举添加description属性

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

"2nd", "The Second one"
此外,我使用自行开发的脚本引擎来解析上述和其他类似需求(这就是为什么我不使用简单的映射函数):


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

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

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

用查找数据替换传入数据后,可以使用

. 这两种方法都允许您以不区分大小写的方式解析输入,并解析两个值或名称。

我重新打开了您的另一个问题,因为它不是重复的。我建议您编辑该问题以包含此处的更多详细信息,然后删除该问题。如果映射在将来不会更改,您可以使用自定义属性。可以按照此链接中的说明更改实例的属性值。但它只会更改该实例的属性值,请参见。您需要对所有实例重复此操作。在我看来,为您的案例使用自定义属性不是正确的方法。更好的方法是使用字典,键作为字符串,值作为枚举。您可以在读取外部xml文件后填充此词典。要分析字符串时,可以从字典中检索枚举值。这里唯一的问题是用作字典键的字符串区分大小写。我建议您在原始问题中添加有关外部文件的信息。这会将解析问题转化为ETL/集成问题—在尝试解析外部数据之前,必须清理外部数据。在这种情况下,任何必需的映射或替换都应放在查找表或文件中,以便在输入发生更改时修改它们
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);