0

私はこれを例で説明しようとします:

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」のような文字列に。

次に、リフレクションを使用してプロパティにアクセスします。

4

3 に答える 3

1

どうですか

vm.TeamName = p.Team.Name != null ? p.Team.Name : "-- no team --";

ジェネリックスもラムダもありませんが、if / elseブロックをワンライナーに置き換えたい場合は、これが最適な方法です。

したがって、マッピング全体をクリーンアップするには、次のようになります。

list.Add( new PlayerVM{
            PlayerFirstName = player.FirstName,    
            TeamName = player.Team.Name != null ? player.Team.Name : "-- no team --"
         });  
于 2011-09-30T08:26:02.303 に答える
1

Playerクラスにプロパティを作成します。

public string TeamName {
    get {
        return this.Team != null ? this.Team.Name : "-- no team --";
    }
}
于 2011-09-30T08:28:52.370 に答える
0

考えられる解決策はここにあります:

リフレクションとLinq.Expressionを使用してネストされたプロパティ値を取得します

于 2011-09-30T09:21:14.763 に答える