Обработка данных и продолжение, если NULL - PullRequest
0 голосов
/ 12 октября 2011

Мне нужно обработать несколько элементов данных, например

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) {
...
}

У меня вопрос, что у.может быть NULL, как я могу обработать объект "User u", не помещая каждый вызов ProcessProperty (...) в блок try / catch?

Извинения, если форматирование вопроса не подходит, явсе еще получаю навык публикации.

Большое спасибо.N.

Ответы [ 5 ]

1 голос
/ 12 октября 2011

Вы можете попробовать (может быть, это не элегантно):

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

и

private void ProcessProperty(string data) {
    if (String.IsNullOrEmpty(data)) {
        ....
    } else {
        ....
    }
}
0 голосов
/ 12 октября 2011

Если вы НЕ МОЖЕТЕ изменить 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;
    }
}
0 голосов
/ 12 октября 2011

Используйте лямбда-выражения и метод расширения для создания, возможно, монады:

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

Вместо использования длинной цепочки точек (как u.Phone.Work.Wh независимо), который завершается ошибкой, если какое-либо из первых свойств имеет значение null, этот метод замыкает накоротко и возвращает значение null, как только он видит нулевое значение.Это может значительно сократить ваш код (в отличие от использования if-проверок), если вам нужно работать со свойством в глубине чужого класса, который, возможно, не очень внимательный программист.Я думаю, что в статье ниже автор использует имя метода With вместо GetPropOrNull, так что даже сокращает его еще больше.

Ссылка:

0 голосов
/ 12 октября 2011

если у вас есть контроль над функцией ProcessProperty, вы можете просто добавить это внутри функции

if(data == null) return;

в противном случае вы можете просто написать это

if(u.Phone != null)
     ProcessProperty(u.Phone.Work);
0 голосов
/ 12 октября 2011

Если вы можете редактировать класс User, я бы изменил код Set для свойств, которые могут быть нулевыми, чтобы преобразовать NULL в String.Empty

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...