C# 使用XElements处理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

我有一个foreach,迭代一个
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不会执行一次,结果也不会固定,即使调试器显示了类似的内容。谢谢!