Linq Xelement和Class

时间:2016-07-20 10:21:18

标签: c# linq xelement

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

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

让我们看看代码:

  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>();

问题在于.?Value对于Chaine类中的每个属性,当我调试时我甚至可以调试解决方案,如果我删除它们我得到NullReferenceException。使用此代码,以前的realese .exe就像魅力

2 个答案:

答案 0 :(得分:1)

您只能在?.

中使用运算符C# 6.0

这是null-propagation运营商。如果您不想使用它,可以将作业更改为Chaine类的属性:

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”)为null,则此代码将简单地为代码分配null:

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

但没有?

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

答案 1 :(得分:1)

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

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

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

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