使用LINQ to XML,Enums将数据从XML提取到C#对象

Bum*_*Bee 2 c# enums linq-to-xml

我试图从XML文件中提取数据并将其保存为我的C#类/对象.我的问题是

我有一个像这样的XMl文件

<personal_auto xmlns = "http://cp.com/rules/client"> 
 <claim id = "s1" type = "Subject Section">
    <report > 
    </report> 
    <policy>
    </policy>
 </claim>
 <claim id = "s2" type = "Vehichle Section">
    <report >
    </report>
    <policy>
    </policy>
  </claim>
  <claim id = "s3" type = "Agent Section">>
    <report 
    </report>
    <policy>
    </policy>
  </claim>
</personal_auto> 
Run Code Online (Sandbox Code Playgroud)

我有这样的枚举

    public enum typesectionEnum
    {
        [Description("Subject Section")]
        subjectSection,
        [Description("Vehicle Section")]
        vehicleSection,
        [Description("Possible Related Section")]
        possibleRelatedSection,
        [Description("Agent (Summary) Section")]
        AgentSection
    }
Run Code Online (Sandbox Code Playgroud)

我试图从XML文件中提取数据并保存到我的C#类/对象.

List<claim> = ( from d in query.Descendants(xmlns + "claim")
                 select new Claim 
                   {
                    id = d.Attribute("id").value,
                    type = ????                    
                    }
                 ).ToList (),
Run Code Online (Sandbox Code Playgroud)

我想知道的是,我想在我的应用程序中设置将访问xml文件中的值的值.

Alb*_*nbo 5

如果DescriptionAttributes与XML中的type属性字符串完全匹配,则可以使用反射.

编辑:转换为通用

public TEnum GetEnum<TEnum>(string input) where TEnum : struct
{
    if (!typeof(TEnum).IsEnum)
        throw new Exception(typeof(TEnum).GetType() + " is not en enum");
    Type dataType = Enum.GetUnderlyingType(typeof(typesectionEnum));
    foreach (FieldInfo field in
        typeof(typesectionEnum).GetFields(BindingFlags.Static | BindingFlags.GetField |
        BindingFlags.Public))
    {
        object value = field.GetValue(null);
        foreach (DescriptionAttribute attrib in field.GetCustomAttributes(true).OfType<DescriptionAttribute>())
        {
            if (attrib.Description == input)
            {
                return (TEnum)value;
            }
        }
    }
    return default(TEnum);
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

select new Claim 
{
    id = d.Attribute("id").value,
    type = GetEnum<typesectionEnum>(d.Attribute("type").value),
}
Run Code Online (Sandbox Code Playgroud)