ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

父级空值的可变分辨率

2019-11-02 02:16:58  阅读:186  来源: 互联网

标签:c refactoring


我有一个方法,其中包含很多这样的语句:

employee.LastName = file.EMPLOYEE.NAME.SUBNAME.FAMILYNAME.NAMEPART1.Value;

(这是一个组合结构.实际结构基于2.3 HL7 XML,并且复杂得多,并且充满了毫无意义的对象.)

所以我的问题是这些值中的任何一个都可以为null.如果我不进行检查,那么当我尝试获取链中的下一个值时,它将引发异常.

显然我可以做这样的事情:

if (contract.EMPLOYEE != null)
 if (contract.EMPLOYEE.NAME.SUBNAME != null)
  if (contract.EMPLOYEE.NAME.FAMILYNAME != null)
   if (contract.EMPLOYEE.NAME.FAMILYNAME.NAMEPART1 != null)
     employee.LastName = file.EMPLOYEE.NAME.SUBNAME.FAMILYNAME.NAMEPART1.Value;  

但这每次我需要设置一个值时都要进行很多检查. (对象树发生了很大变化,因此我无法对其进行一次检查并无法完成系统.)

也许更好的方法是这样做:

try
{
   employee.LastName = file.EMPLOYEE.NAME.SUBNAME.FAMILYNAME.NAMEPART1.Value;
}
catch
{}

(请注意,如果该值不存在,那么我什么也没做就可以了.)

但是,这仍然有些混乱.我仅用此方法就可以设置14个项目,并且还有很多其他项目.

有什么办法可以使我抽象化,这样我就可以做我的二传手而已?

我想到了可以执行check / try语句的方法调用,但是如果我传入file.EMPLOYEE.NAME.SUBNAME.FAMILYNAME.NAMEPART1.Value,它将在我通过它时尝试解决它(因此给了我一个例外) .

还有其他(干净的)方法吗? (也许可以使用扩展方法?)我将不胜感激.

注意:我最终只是对每一行都这样做:

try { employee.LastName = file.EMPLOYEE.NAME.SUBNAME.FAMILYNAME.NAMEPART1.Value; } catch (System.NullReferenceException) { }

它似乎比lambda系统更具可读性.

解决方法:

这个怎么样:

static class Coalesce
{
    static public TResult C<T, TResult>(this T obj, Func<T, TResult> func)
        where TResult : class
    {
        if (obj != null)
            return func(obj);
        return null;
    }
}

像这样使用:

employee.LastName =
    file.C(o => o.EMPLOYEE)
        .C(o => o.NAME)
        .C(o => o.SUBNAME)
        .C(o => o.FAMILYNAME)
        .C(o => o.NAMEPART1)
        .C(o => o.Value); 

如果链中的任何属性为null,则将返回null.

这是由问题Extending the C# Coalesce Operator启发的,但是我使用了稍微不同的方法.以稍微更长的调用语法为代价,我的扩展类更加简单,并且链中的链接数没有限制.

您也可以将其与??结合使用运算符以分配默认值:

class Foo { public Bar MyBar { get; } }
class Bar { public Baz MyBaz { get; } }
class Baz { }

Baz baz = foo.C(o => o.MyBar).C(o => o.MyBaz) ?? new Baz();

标签:c,refactoring
来源: https://codeday.me/bug/20191102/1988241.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有