2013-10-03 57 views
1

我有這個轉換器類。AutoMapper映射這個特定的場景

public class StatsConverter : TypeConverter<Tuple<Player,Stats>, StatsModel> 
             , ITypeConverter<Stats, StatsModel> 
{ 
    protected override StatsModel ConvertCore(Tuple<Player, Stats> source) 
    { 

     var pm = new StatsModel 
      { 
       Id = source.Item2.Id, 
       PlayerId = source.Item1.Id, 
       DisplayName = source.Item2.DisplayName, 

      }; 
     return pm; 
    } 
} 

如何在以下情況下,我有List ---- player.PlayerStats需要被映射回一個IEnumerable<StatsModel>

[HttpGet("{id:int}/PlayerStats", RouteName = "GetPlayerStats")] 
public IEnumerable<StatsModel> GetPlayerStats(int id) 
{ 
    var user = this._manager.GetPlayerById(id); 

    // I can retrieve a "List" of player.PlayerStats. 
    //But how do I map and return it? 
    return this._mapper.Map<IEnumerable<StatsModel>>(????) 
} 

當我這樣做

return this._mapper.Map<IEnumerable<StatsModel>>(player.PlayerStats); 

我得到這個錯誤: Change the type converter source type, or redirect the source value supplied to the value resolver using FromMember

+1

'_manager.GetPlayerById'的方法簽名是什麼? – Romoku

+0

Player GetPlayerById(int id); – GilliVilla

+1

你需要一個像你指定的'Tuple '。 – Romoku

回答

0
public class StatsConverter : ITypeConverter<Tuple<Player, Stats>, StatsModel> 
{ 
    public StatsModel Convert(Tuple<Player, Stats> source) 
    { 
     return new StatsModel 
       { 
        Id = source.Item2.Id, 
        PlayerId = source.Item1.Id, 
        DisplayName = source.Item2.DisplayName, 
       }; 
    } 
} 

首先確保您的轉換器已指定。

Mapper.CreateMap<Tuple<Player,Stats>, StatsModel> 
     .ConvertUsing<StatsConverter>(); 

我會從你的問題的假設,Player類結構(糾正我,如果我錯了):

public class Player 
{ 
    public int Id { get; set; } 
    public IEnumerable<Stats> PlayerStats { get; set; } 
} 

裏面你的方法,你將需要得到的球員,統計分組在一起。

var user = _manager.GetPlayerById(id); 

// Expand the player stats 
var playerStats = user.PlayerStats 
         .Select(stats => Tuple.Create(user, stats)); 

Mapper.Map<IEnumerable<Tuple<Player,Stats>>, 
      IEnumerable<StatsModel>>(playerStats);