Linq Xelement 和 Class

Linq Xelement and Class

所以,让我解释一下我的麻烦。

我得到一个由另一个人开发的项目,他离开了公司。现在我必须更新程序,但是当我导入解决方案时出现问题。

让我们看看代码:

  ListeDeTypeDePoste = (from e in xml.Descendants("profil")
                              select new TypeDePoste()
                              {
                                  Nom = e.Element("name").Value,
                                  Chaines = (from c in e.Elements("Chaine")
                                             select new Chaine()
                                             {
                                                 Code = c.Element("Code")?.Value,
                                                 Type = c.Element("Type")?.Value,
                                                 Nom = c.Element("Nom")?.Value,
                                                 OU = c.Element("OU")?.Value
                                             }).ToList()
                              }).ToList<TypeDePoste>();

问题出在 Chaine Class 中每个属性的 .?Value,当我调试时,我什至可以调试解决方案,如果我删除它们,我会得到一个 NullReferenceException。使用此代码,以前的 realese .exe 运行起来就像一个魅力

您只能在 C# 6.0.

中使用运算符 ?.

这是null-propagation运算符。如果您不想使用它,您可以将您的分配更改为 Chaine class:

的属性
select new Chaine()
{
    Code = (c.Element("Code") == null) ? null : c.Element("Code").Value,
    Type = (c.Element("Type") == null) ? null : c.Element("Type").Value,
    Nom = (c.Element("Nom") == null) ? null : c.Element("Nom").Value,
    OU = (c.Element("OU") == null) ? null : c.Element("OU").Value
}).ToList()

如果您在此运算符中删除 ?,赋值将会崩溃,因为您试图获取 null 的值。

如果 c.Element("Code") 为空,则此代码将简单地将空分配给代码:

Code = c.Element("Code")?.Value;

但没有?:

Code = c.Element("Code").Value; //app will throw an exception because c.Element("Code") is null

这是因为该代码中的 Element 调用有时会返回 null,因为 XML 文档中的那个位置不存在具有给定名称的元素'正在处理中。

?. (null-conditional) 运算符对此进行测试,在这种情况下返回 null

如果您改用 .(不添加您自己的 null 检查),那么在这种情况下将抛出 NullReferenceException。这是 C# 中的设计使然。

空条件运算符是 introduced in C# 6,因此要使用它,您需要安装 Visual Studio 2015.