2011-09-30 25 views
0

我嘗試用一​​個例子來說明這一點:更好的辦法從財產的子對象返回值時childobject可以爲空

public class Player 
{ 
    public string FirstName {get; set;} 
    public Team Team {get; set;} 
} 

public class Team 
{ 
    public string Name {get; set;} 
} 

現在我要地圖玩家一個PlayerVM(視圖模型)

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 --"); 

這是可能使用通用蘭巴/ FUNC表情?

< <編輯>>

感謝您的答案,我知道我可以使用oneliners,但我實際上是尋找訪問嵌套子對象的通用方式。 (嵌套可能是X級深...)

string countryName = Utils.GetProperty<Player>(p => p.Team.Country.Name, "-- no country --"); 

如何做到這一點?

< <編輯2 >> 一個可能的解決辦法來使用此代碼 http://code.google.com/p/gim-projects/source/browse/presentations/CantDanceTheLambda/src/MemberNameParser.cs

像「Team.Country.Name」的字符串轉換函數功能表達。

然後使用反射來訪問屬性。

+0

這不是你的問題的直接解決方案 - 因此我只有com對它的評論。這裏真正的問題是'null'值。恕我直言,真正的解決方案不是 - 使用null作爲有效的結果/值。而是實現空對象模式:http://en.wikipedia.org/wiki/Null_Object_pattern – Carsten

+0

是的這是可能的,但不是直接與泛型,但與表達式/反思和它的相關成本 - 如果你intertted我可能會插入一些代碼一起但我不會去這條路線(性能) - WPF正在做類似的東西 – Carsten

回答

1

什麼

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

沒有仿製藥,沒有拉姆達,但如果你想用oneliner更換的if/else塊,這是要走的路。

所以要清理整個映射這將是

list.Add(new PlayerVM{ 
      PlayerFirstName = player.FirstName,  
      TeamName = player.Team.Name != null ? player.Team.Name : "-- no team --" 
     }); 
+0

,如果團隊是空的沒有解決方案... – Carsten

+0

如果我想使用一個oneliner,它會像vm。TeamName = p.Team!= null? p.Team.Name:「 - 沒有球隊 - 」; –

+0

感謝您的回答,請參閱我的<< Edit >>筆記 –

1

我將創建一個Player類的屬性:

public string TeamName { 
    get { 
     return this.Team != null ? this.Team.Name : "-- no team --"; 
    } 
} 
+0

感謝您的回答,請參閱我的<< Edit >>筆記 –

相關問題