Лучший способ вернуть значение из свойства дочернего объекта, когда дочерний объект может быть нулевым - PullRequest
0 голосов
/ 30 сентября 2011

Я пытаюсь объяснить это на примере:

public class Player
{
    public string FirstName {get; set;}
    public Team Team {get; set;}
}

public class Team
{
    public string Name {get; set;}
}

Теперь я хочу сопоставить Player с PlayerVM (ViewModel)

public class PlayerVM
{
    public string PlayerFirstName {get; set;}

    public string TeamName {get; set;}
}

Так что код выглядит примерно так:

public List<PlayerVM> GetPlayers()
{
    // Lazy loading enabled,
    // so the Team child objects (if present, will be retrieved)
    var players = Database.GetPlayers();

    var list = new List<PlayerVM>();
    foreach (var player in players)
    {
        var vm = new PlayerVM();

        vm.PlayerFirstName = player.FirstName;

        if (player.Team != null)
        {
            vm.TeamName = player.Team.Name;
        }
        else
        {
            vm.TeamName = "-- no team --";
        }

        list.Add(vm);
    }

    return list;
}

Я хочу заменить

if (player.Team != null)
{
    vm.TeamName = player.Team.Name;
}
else
{
    vm.TeamName = "-- no team --";
}

на что-то вроде:

vm.TeamName = Utils.GetProperty<Player>(p => p.Team.Name, "-- no team --");

возможно ли это с использованием обобщенных выражений Lamba / Func?

<< Edit >>

Спасибо за ответы, я знаю, что могу использовать oneliners, но на самом деле я искал универсальный способ доступа к вложенным дочерним объектам.(Вложенность может быть глубиной X уровней ...)

string countryName = Utils.GetProperty<Player>(p => p.Team.Country.Name, "-- no country --");

Как это сделать?

<< Edit 2 >> Возможным решением было бы преобразование выражения Func с использованием этого кодаhttp://code.google.com/p/gim-projects/source/browse/presentations/CantDanceTheLambda/src/MemberNameParser.cs

в строку типа «Team.Country.Name».

Затем используйте отражение для доступа к свойствам.

Ответы [ 3 ]

1 голос
/ 30 сентября 2011

Я бы создал свойство в классе Player:

public string TeamName {
    get {
        return this.Team != null ? this.Team.Name : "-- no team --";
    }
}
1 голос
/ 30 сентября 2011

Как насчет

vm.TeamName = p.Team.Name != null ? p.Team.Name : "-- no team --";

Нет обобщений, нет лямбды, но если вы хотите заменить блок if / else на oneliner, это путь.

Итак,очистить всю карту это будет

list.Add( new PlayerVM{
            PlayerFirstName = player.FirstName,    
            TeamName = player.Team.Name != null ? player.Team.Name : "-- no team --"
         });  
0 голосов
/ 30 сентября 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...