2012-02-29 140 views
1

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

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

使用,当你解析状态,而不是你现在该行的下面的代码片段。

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

尽管你的代码没有显示它即时猜测你正在加载一个XmlDoc或其他东西。

改为使用XmlSerializer

东西沿着线:

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

为什么你认为这将是最好用的XmlSerializer在LINQ? – user829174 2012-02-29 10:20:03

+0

我会说在编码方面它更简单 - 并不是更好。依赖于它如何使用XmlSerializer可能会更快。也许我应该说“你可以使用XmlSerializer而不是” – dice 2012-02-29 10:59:39

2

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

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

当我尝试按照你所说的解析它时,我得到错误:无法将类型'System.Xml.Linq.XElement'转换为'Verint.AP2.Manager.AutomationStatusType' – user829174 2012-02-29 10:24:46

相关问题