【问题标题】:AutoMapper mapping for this specific scenario针对此特定场景的 AutoMapper 映射
【发布时间】:2013-10-03 18:35:27
【问题描述】:

我有这个转换器类。

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&lt;StatsModel&gt;

[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.

【问题讨论】:

  • _manager.GetPlayerById的方法签名是什么?
  • 玩家GetPlayerById(int id);
  • 你需要一个Tuple&lt;Player,Stats&gt;,就像你指定的那样。
  • 如何实现错误消息中指定的 FromMember?

标签: c# asp.net-web-api tuples return-value automapper


【解决方案1】:
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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2023-03-26
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多