当childobject可以为null时,更好地从子对象的属性返回值

时间:2011-09-30 08:24:13

标签: c# lambda properties relation

我试着用一个例子解释这个:

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”之类的字符串。

然后使用反射来访问属性。

3 个答案:

答案 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