我试着用一个例子解释这个:
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 --");
这可能使用通用的Lamba / Func表达式吗?
&LT;&LT;编辑&gt;&gt;
感谢您的回答,我知道我可以使用oneliners,但实际上我正在寻找一种访问嵌套子对象的通用方法。 (嵌套可能是X级深......)
string countryName = Utils.GetProperty<Player>(p => p.Team.Country.Name, "-- no country --");
怎么做?
&LT;&LT;编辑2&gt;&gt; 一种可能的解决方案是使用此代码转换Func表达式 http://code.google.com/p/gim-projects/source/browse/presentations/CantDanceTheLambda/src/MemberNameParser.cs
到“Team.Country.Name”之类的字符串。
然后使用反射来访问属性。
答案 0 :(得分:1)
怎么样?
vm.TeamName = p.Team.Name != null ? p.Team.Name : "-- no team --";
没有泛型,没有lambda,但是如果你想用oneliner替换if / else块,这就是你要走的路。
所以要清理整个映射,它将是
list.Add( new PlayerVM{
PlayerFirstName = player.FirstName,
TeamName = player.Team.Name != null ? player.Team.Name : "-- no team --"
});
答案 1 :(得分:1)
我会在Player
类中创建一个属性:
public string TeamName {
get {
return this.Team != null ? this.Team.Name : "-- no team --";
}
}
答案 2 :(得分:0)
可以在这里找到一个可能的解决方案:
Get Nested Property value using reflection and Linq.Expression