无法将类型为“System.Xml.Linq.XElement”的表达式转换为XXX类型

时间:2012-02-29 10:09:45

标签: c# linq

我收到编译错误:无法将类型为'System.Xml.Linq.XElement的表达式转换为类型AutomationStatusType 我做错了什么?

的xml:

<Status>
    <Version>33</Version>
    <Status>Running</Status>
</Status>

查询:

var query = (from status in doc.Descendants("Status")
    select new AutomationStatus
            {
                Version = (string)status.Element("Version"),
                Status = (AutomationStatusType)status.Element("Status"),
            });

类:

public class AutomationStatus
{
    [XmlAttribute]
    public string Version { get; set; }
    [XmlElement]
    public AutomationStatusType Status { get; set; }
}


[DataContract]
public enum AutomationStatusType
{
    [EnumMember]
    Idle,
    [EnumMember]
    Running
}    

修改 在阅读你的评论后,我的确添加了以下内容:

Status = Enum.Parse(typeof(AutomationStatusType), (string)status.Element("Status")),

现在我收到了编译错误: 无法将类型'System.Xml.Linq.XElement'转换为'Verint.AP2.Manager.AutomationStatusType'

但是,如果我创建一个匿名类,我可以摆脱错误:

    var query = (from status in doc.Descendants("AutomationStatus")
                 select new /*AutomationStatus*/
                            {
                                Version = (string)status.Element("Version"),
                                Status = Enum.Parse(typeof(AutomationStatusType), (string)status.Element("Status")),
                                TimeStamp = (DateTime) status.Element("TimeStamp")
                            });

可能是什么问题,如何创建课程(非匿名?) 谢谢!

3 个答案:

答案 0 :(得分:3)

在解析状态而不是现在的行时使用以下代码段。

Status = Enum.Parse(typeof(AutomationStatusType), status.Element("Status")

答案 1 :(得分:2)

type conversion operator与您的枚举之间没有XElement。您需要将convert the XElement to a stringparse字符串添加到枚举:

{
    Version = (string)status.Element("Version"),
    Status = (AutomationStatusType)Enum.Parse(
        typeof(AutomationStatusType), (string)status.Element("Status")),
}

答案 2 :(得分:0)

虽然您的代码没有显示它,但我猜你正在加载XmlDoc或其他东西。

改为使用XmlSerializer

类似于:

 XmlSerializer serializer = new XmlSerializer(typeof(AutomationStatus));
 FileStream fs = new FileStream(filename, FileMode.Open);
 AutomationStatus x;
 x = (AutomationStatus) serializer.Deserialize(fs);