Я пытаюсь объяснить это на примере:
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».
Затем используйте отражение для доступа к свойствам.