我试图弄清楚如何处理所有“卡”元素都不存在的节点。我有以下linq查询:
FinalDeck = (from deck in xmlDoc.Root.Element("Cards")
.Elements("Card")
select new CardDeck
{
Name = deck.Attribute("name").Value,
Image = deck.Element("Image").Attribute("path").Value,
Usage = (int)deck.Element("Usage"),
Type = deck.Element("Type").Value,
Strength = (int)deck.Element("Ability") ?? 0
}).ToList();
有了Strength项目,我读过另一篇帖子了?处理null。我收到以下错误:
运营商'??'不能应用于'int'和'int'
类型的操作数我该如何处理这个问题?
谢谢!
答案 0 :(得分:4)
而不是使用Value
属性,转换为string
...而不是int
,而是转换为int?
。如果源XAttribute
/ XElement
为空,则用户定义的转换为可空类型将返回null:
FinalDeck = (from deck in xmlDoc.Root.Element("Cards")
.Elements("Card")
select new CardDeck
{
Name = (string) deck.Attribute("name"),
Image = (string) deck.Element("Image").Attribute("path"),
Usage = (int?) deck.Element("Usage"),
Type = (string) deck.Element("Type"),
Strength = (int?) deck.Element("Ability") ?? 0
}).ToList();
请注意,对于缺少Image
元素的情况,此不会帮助,因为它会尝试取消引用null元素以查找path
属性。如果你想要一个解决方法,让我知道,但相对而言,这将是一个痛苦。
编辑:你总是可以自己创建一个扩展方法:
public static XAttribute NullSafeAttribute(this XElement element, XName name)
{
return element == null ? null : element.Attribute(name);
}
然后这样称呼:
Image = (string) deck.Element("Image").NullSafeAttribute("path"),