如何在 AutoMapper 中映射通用结构类型

How to map generic struct type in AutoMapper

我想将 MyEntity 映射到 MyModel。第一个是由无法修改的 ORM 生成器给出的。 当然,如果没有任何映射定义,AutoMapper 无法映射 Id<> -> long

public class MyEntity
{
  public Id<MyEntity> Id { get; set; }
  public string Name { get; set; }
  public Id<MyFooEntity> FooId { get; set; }
  public Id<MyBarEntity> BarId { get; set; }
}

public class MyModel
{
  public long Id { get; set; }
  public string Name { get; set; }
  public long FooId { get; set; }
  public long BarId { get; set; }
}

public struct Id<T>
{
  private long _internalId { get; set; }
  public long ToLong() => _internalId;
}

以下是有效的:

CreateMap<MyEntity, MyModel>()
  .ForMember(d.Id, o => o.MapFrom(s => s.ToLong())
  .ForMember(d.FooId, o => o.MapFrom(s => s.ToLong())
  .ForMember(d.BarId, o => o.MapFrom(s => s.ToLong());

我在一个实体中有很多实体和几十个 id 属性。我喜欢做的是定义一个通用结构映射 Id<> -> long。但到目前为止,这似乎是不可能的。我尝试了 TypeConverterITypeConverter<,> 和其他东西。我得到的最接近的是这个,但是 AutoMapper 抱怨 Id<> 不是引用类型,不能用作 System.Object:

CreateMap(typeof(Id<>), long).ConvertUsing((s, d) => s.ToLong());

有什么建议如何做到这一点?有没有办法像 int -> stringint -> long、...

这样已经存在的那样定义全局映射

是的,这是可能的。但是你需要修改Id<T>结构。

据我所知,您正在使用一些生成器来生成源文件。 MyEntity 例如。 生成 类 后,您需要手动修改 Id<T> 结构。它应该有一个像这样的界面,例如:

public interface IId
{
    long ToLong();
}

public struct Id<T> : IId
{
    private long _internalId { get; set; }
    public long ToLong() => _internalId;
}

现在您可以像这样创建配置,它将映射 类 中的所有 Id<T> 类型。

configuration.CreateMap<MyEntity, MyModel>();

configuration.CreateMap<IId, long>()
                .ConvertUsing(x => x.ToLong());