处理数据并在NULL时继续

时间:2011-10-12 11:04:54

标签: c# object process null

我必须处理一些数据项,例如

User u = NotMyObject.GetUser(100);
ProcessProperty(u.FirstName);
ProcessProperty(u.Surname);
ProcessProperty(u.Phone.Work);
ProcessProperty(u.Phone.Mobile);
...
ProcessProperty(u.Address.PostCode);

认为所有属性都是从GetUser(...)返回的字符串。我希望ProcessProperty所做的是,不相关(例如,可能将值写入文件),但它看起来像:

private void ProcessProperty(string data) {
...
}

我的问题是u.Phone&同样u.Address可能为NULL如何在不将每个ProcessProperty(...)调用放入try / catch块的情况下处理“User u”对象?

如果问题的格式不好,我仍然抱怨发布。

非常感谢。 Ñ

5 个答案:

答案 0 :(得分:1)

你可以尝试(也许它不优雅):

ProcessProperty(u.Phone == null ? null : u.Phone.Work);

private void ProcessProperty(string data) {
    if (String.IsNullOrEmpty(data)) {
        ....
    } else {
        ....
    }
}

答案 1 :(得分:0)

如果你可以编辑User类,我会更改属性的Set代码,可以为null,将NULL转换为String.Empty

答案 2 :(得分:0)

如果您可以控制ProcessProperty函数,那么您可以在函数

中添加它
if(data == null) return;

否则你可以写这个

if(u.Phone != null)
     ProcessProperty(u.Phone.Work);

答案 3 :(得分:0)

使用lambda表达式和扩展方法制作一个monad:

public static class ObjectExt
{
    public static TProp GetPropOrNull<TObj, TProp>(this TObj obj, 
        Func<User,TProp> getProp)
        where TObj : class
        where TProp : class
    {
        if (obj == null)
            return null;
        else
            return getProp(obj);
    }
}

<强>用法:

u.GetPropOrNull(obj => obj.Phone).GetPropOrNull(obj => obj.Work);
u.GetPropOrNull(obj => obj.Phone).GetPropOrNull(obj => obj.Home);

如果任何第一个属性为null,则该方法会短路并返回null,而不是使用长点链(如u.Phone.Work.Whatever),它会在看到null时立即返回null。如果您必须在其他人的课程中深入研究可能不是非常小心的程序员,那么这可以大大缩短您的代码(而不是使用if-checks)。我认为在下面的文章中,作者使用方法名称With而不是GetPropOrNull,这样甚至可以进一步缩短它。

参考:

答案 4 :(得分:0)

如果您无法更改 ProcessProperty ,请考虑将其包装:

private void ProcessPropertySafe(string data) 
{
    if (data != null)
    {
        ProcessProperty(data);
    }
}

或者像int.Parse()与int.TryParse():

一样
private bool TryProcessProperty(string data) 
{
    try
    {
        ProcessProperty(data);
        return true;
    }
    catch // <- That's not clean ...
    {
        return false;
    }
}