我试着用一个例子来解释这一点:
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 表达式吗?
<< 编辑 >>
感谢您的回答,我知道我可以使用 oneliners,但我实际上是在寻找一种访问嵌套子对象的通用方法。(嵌套可能有 X 层深......)
string countryName = Utils.GetProperty<Player>(p => p.Team.Country.Name, "-- no country --");
这个怎么做 ?
<< 编辑 2 >> 一个可能的解决方案是使用此代码转换 Func 表达式 http://code.google.com/p/gim-projects/source/browse/presentations/CantDanceTheLambda/src/MemberNameParser.cs
像“Team.Country.Name”这样的字符串。
然后使用反射来访问属性。