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.
所以,让我解释一下我的麻烦。
我得到一个由另一个人开发的项目,他离开了公司。现在我必须更新程序,但是当我导入解决方案时出现问题。
让我们看看代码:
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.