C# 无法强制转换类型为';System.Xml.Linq.XElement到XXX类型

C# 无法强制转换类型为';System.Xml.Linq.XElement到XXX类型,c#,linq,C#,Linq,我收到编译器错误:无法将“System.Xml.Linq.XElement”类型的表达式强制转换为AutomationStatusType类型 我做错了什么 xml: 课程: public class AutomationStatus { [XmlAttribute] public string Version { get; set; } [XmlElement] public AutomationStatusType Status { get; set; } }

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

xml:

课程:

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")
                            });
有什么问题,如何创建类(非匿名?)
谢谢

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

改用
XmlSerializer

大致如下:

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

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

改用
XmlSerializer

大致如下:

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

当您解析状态而不是您现在拥有的行时,请使用以下代码段

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

当您解析状态而不是您现在拥有的行时,请使用以下代码段

Status = Enum.Parse(typeof(AutomationStatusType), status.Element("Status")
与您的枚举之间不存在任何差异。您需要将字符串与枚举相关联:

{
    Version = (string)status.Element("Version"),
    Status = (AutomationStatusType)Enum.Parse(
        typeof(AutomationStatusType), (string)status.Element("Status")),
}
与您的枚举之间不存在任何差异。您需要将字符串与枚举相关联:

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

为什么您认为最好在linq上使用XmlSerializer?我想说,它在编码方面更简单,不一定更好。取决于它的使用方式,XmlSerializer可能会更快。也许我应该说“您可以使用XmlSerializer代替”为什么您认为最好使用XmlSerializer而不是linq?我会说它在编码方面更简单,而不是更好。取决于它的使用方式,XmlSerializer可能会更快。也许我应该说“您可以使用XmlSerializer代替”,当我尝试按照您所说的方式解析它时,我得到了一个错误:无法将类型“System.Xml.Linq.XElement”转换为“Verint.AP2.Manager.AutomationStatusType”,我收到错误:无法将类型“System.Xml.Linq.XElement”转换为“Verint.AP2.Manager.AutomationStatusType”