私はこれを例で説明しようとします:
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 --");
これを行う方法 ?
<< Edit 2 >>考えられる解決策は、このコードhttp://code.google.com/p/gim-projects/source/browse/presentations/CantDanceTheLambda/src/MemberNameParser.csを使用してFunc式を変換することです。
「Team.Country.Name」のような文字列に。
次に、リフレクションを使用してプロパティにアクセスします。