当子对象可以为空时,从子对象返回属性值的更好方法
本文关键字:对象 属性 返回 更好 方法 | 更新日期: 2023-09-27 18:10:18
我试着用一个例子来解释这一点:
public class Player
{
public string FirstName {get; set;}
public Team Team {get; set;}
}
public class Team
{
public string Name {get; set;}
}
现在我想映射一个播放器到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 --");
是否可以使用泛型lambda/Func表达式?
& lt; & lt;编辑>>
谢谢你的回答,我知道我可以使用在线程序,但我实际上是在寻找一种通用的方式来访问嵌套的子对象。(嵌套可能有X层深…)
string countryName = Utils.GetProperty<Player>(p => p.Team.Country.Name, "-- no country --");
怎么做?
& lt; & lt;编辑2>>一个可能的解决方案是使用此代码转换函数表达式http://code.google.com/p/gim-projects/source/browse/presentations/CantDanceTheLambda/src/MemberNameParser.cs
到像"Team.Country.Name"这样的字符串。
vm.TeamName = p.Team.Name != null ? p.Team.Name : "-- no team --";
没有泛型,没有lambda,但如果你想用在线代码块替换if/else块,这就是你要做的。
所以为了清理整个映射它将是
list.Add( new PlayerVM{
PlayerFirstName = player.FirstName,
TeamName = player.Team.Name != null ? player.Team.Name : "-- no team --"
});
我将在Player
类中创建一个属性:
public string TeamName {
get {
return this.Team != null ? this.Team.Name : "-- no team --";
}
}
可以在这里找到一个可能的解决方案:
使用反射和Linq获取嵌套属性值。表达