C# 使用XElements处理foreach中的句柄异常
我有一个foreach,迭代一个C# 使用XElements处理foreach中的句柄异常,c#,C#,我有一个foreach,迭代一个IEnumerable 有时,它会抛出一个异常 System.NullReferenceException:Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.(翻译:“对象引用未在对象安装上设置”) 我确实解析了一个xmldom,找到了一些特定的节点并尝试对它们进行分析。 有什么想法,如何避免这种情况 这是我的代码: var query = from p in dom.Descendan
IEnumerable
有时,它会抛出一个异常
System.NullReferenceException:Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
(翻译:“对象引用未在对象安装上设置”)我确实解析了一个
xmldom
,找到了一些特定的节点并尝试对它们进行分析。
有什么想法,如何避免这种情况
这是我的代码:
var query = from p in dom.Descendants("meta")
where (string)p.Attribute("name").Value == "custom.customer.ImageID" && p.Value != ""
select p;
foreach (var el in query)
{
if (el is XElement && el.Value != null && el.Value != "")
{
el.AddAfterSelf(this.getImageElement(el, "custom.customer.ImageUrl"));
}
}
如果任何
meta
元素缺少name
属性,则这将引发NullReferenceException:
p.Attribute("name").Value
您可以将Xelement和XAttributes强制转换为字符串以获取其字符串值,您可以在此处执行此操作以避免出现异常:
var query = from p in dom.Descendants("meta")
where (string)p.Attribute("name") == "custom.customer.ImageID" &&
p.Value != ""
select p;
foreach (var el in query)
{
if (el is XElement && el.Value != null && el.Value != "")
{
el.AddAfterSelf(this.getImageElement(el, "custom.customer.ImageUrl"));
}
}
您似乎试图访问一个不存在的属性。更改代码,确保“name”属性不为null:
var query = from p in dom.Descendants("meta")
where p.Attribute("name") != null && (string)p.Attribute("name").Value == "custom.customer.ImageID" && p.Value != ""
select p;
您还应该评估这是最好的选择,还是只是忽略了错误/更深层次的问题
根据您的评论判断,您应该知道特定的Linq查询是在您开始迭代它时执行的(即,您使用的是延迟执行),而不是在您创建它时执行的。详情请参阅:
在返回值序列的查询中,查询变量
它本身从不保存查询结果,只存储查询
命令。查询的执行延迟到查询变量
在foreach或For Each循环中迭代
给我们看看这个的代码。这可能是因为代码中的某个空对象。我添加了一些示例代码,对不起,您是否尝试添加
&&el!=在el is XElement
之后为null
?在代码中的哪一点出现此错误?您好,添加了一个&&el!=null
,但它仍然在`foreach(查询中的var el){`I调试了结果,所有元素都“命中”一行抛出异常在查询的过程中,它也会迭代一段时间,然后在前段中间,它在前线中抛出一个异常。@ sasChaseSnac是的,如果某些元素有<代码>名称<代码>属性,我希望它会发生。您尝试过我建议的更改吗?或者您只是假设它是错误的而不尝试我。t?就是这样,你完全正确。更改了代码,现在一切都很顺利。我不知道LINQ不会执行一次,结果也不会固定,即使调试器显示了类似的内容。谢谢!