Ell*_*lis 5 c# xml xml-deserialization
我从WCF服务获得了大量的XML负载,我需要将其写入SQL数据库.我正在使用最新版本的.NET和Entity Framework 6.
"好的,那很好,"你可能会说,"但问题是什么?"
好吧,XML被反序列化为C#对象(从paste-special生成),并且它们的工作非常好.但是,每当来自服务的有效负载不包含某些字段时,当我将XML对象写入EF对象时,我得到一个空引用异常(这是一个类方法):
public ICollection<object> GetObjects()
{
List<object> objs = new List<object>();
foreach (var i in XmlObject.SubObj.SubObj.SubObj)
{
objs.Add(new MyEfObject() {
Prop1 = XmlObject.SubObj.SubObj.SubObj.ObjProperty // If "ObjProperty" is null,
// I get a null reference exception
});
}
return objs;
}
Run Code Online (Sandbox Code Playgroud)
所以,我有非常优雅的代码来检查
if (!ReferenceEquals(XmlObject.SubObj.SubObj.SubObj.ObjProperty, null) {
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
这通常会很好,但是对象太大了,我想避免输入150次以上(以及对象的所有对象属性).
必须有一个更优雅的方式,不是吗?
你可以简单地使用==,但在我看来,不优雅的部分不会被检查null(可以使用空对象模式来避免),但事实上您正在访问XmlObject.SubObj.SubObj.SubObj.ObjProperty,我认为您的类确实太耦合了。
也就是说,如果您无法更改此设置,那么您可以使用 LINQ 来使代码更具可读性:
public ICollection<MyEfObject> GetObjects() {
return XmlObject.SubObj.SubObj.SubObj
.Where(x => x.property != null)
.Select(x => new MyEfObject { Prop1 = x.property })
.ToList();
}
Run Code Online (Sandbox Code Playgroud)