XSD / XML:将数据转换为Enum项或XmlEnumAttribute项

时间:2016-12-22 17:58:13

标签: c# xml enums xsd

我遇到了一个我无法解决的问题。所以我呼吁你:

我已经通过xsd.exe从XSD生成了一个类。 XSD包含转换为此类型枚举的列表:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1087.0")]
[System.SerializableAttribute()]
public enum BlocsListe
{
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("2 blocs")]
    Item2blocs,
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("4 blocs")]
    Item4blocs,
    /// <remarks/>
    ND,
}

使用此枚举的属性:

    private BlocsListe _typeBlocs;
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public BlocsListe TypeBlocs
        {
            get
            {
                return this._typeBlocs;
            }
            set
            {
                this._typeBlocs = value;
            }
        }

我通过DataReader从数据库中提取元素,然后尝试将数据库中包含的值分配给对象的TypeBlocks属性。

这就是我被困住的地方。 在数据库中,存储XmlEnumAttribute的内容。 因此,我有这样的情况:我没有数据库中的值,其他我有一个对应于枚举项的值,以及存储在数据库中的值与枚举中的无项不对应的情况。

我尝试解析DataReader的内容,找到与XmlEnumAttribute之一的对应关系,然后分配我的属性。 我阻止了它。

为简化起见,其他一些枚举不包含XmlEnumAttribute(请参阅上面枚举的“ND”)。

如果您有任何建议,我是接受者。

提前谢谢

1 个答案:

答案 0 :(得分:1)

最后找到了以下解决方案:

public static Dictionary<string,T> CheckEnumValue<T>(string value)
    {
        Dictionary<string,T> DicEnum = new Dictionary<string, T>();
        if (!string.IsNullOrEmpty(value))
        {
            Type type = typeof(T);
            MemberInfo[] memberInfo;

            foreach (T b in Enum.GetValues(typeof(T)))
            {
                memberInfo = type.GetMember(b.ToString());
                object[] attributes = memberInfo[0].GetCustomAttributes(typeof(System.Xml.Serialization.XmlEnumAttribute), false);

                if (attributes.Length == 1)
                {
                    XmlEnumAttribute attribute = attributes[0] as System.Xml.Serialization.XmlEnumAttribute;
                    if (attribute != null && !string.IsNullOrEmpty(attribute.Name) && attribute.Name.Equals(value))
                        DicEnum.Add(attribute.Name, b);                            
                }
                else
                {
                    if (b.ToString().Equals(value))
                        DicEnum.Add(b.ToString(), b);
                }
            }
            return DicEnum;
        }
        return null;
    }