针对此特定方案的AutoMapper映射

时间:2013-10-03 18:35:28

标签: c# asp.net-web-api tuples return-value 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;
    }
}

如何在我需要映射IEnumerable<StatsModel> ---- List的情况下返回player.PlayerStats

[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 个答案:

答案 0 :(得分: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);