我必须处理一些数据项,例如
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”对象?
如果问题的格式不好,我仍然抱怨发布。
非常感谢。 Ñ
答案 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;
}
}