反序列化大量 XML 文档时忽略空引用

Ignoring null references when de-serializing a massive XML document

我从我的 WCF 服务中获得了 XML 的大量负载,我需要将其写入 SQL 数据库。我使用的是最新版本的 .NET 和 Entity Framework 6.

"Okay, that's great," 你可能会说,"but what's the question?"

好吧,XML 正在被反序列化为 C# 对象(从特殊粘贴生成)并且它们工作得很好。但是,只要来自服务的有效负载不包含某些字段,当我将 XML 对象写入 EF 对象(这是一个 class 方法)时,我会收到空​​引用异常:

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;
}

所以,我有非常不优雅的代码要检查

if (!ReferenceEquals(XmlObject.SubObj.SubObj.SubObj.ObjProperty, null) {
    // Do stuff
}

这通常没问题,但对象太大了,我想避免输入 150 多次(以及对象的所有对象属性)。

必须有更优雅的方式,不是吗?

您可以简单地使用 == 但 IMO 不优雅的部分不是检查 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();
}