如何在 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
。但到目前为止,这似乎是不可能的。我尝试了 TypeConverter
、ITypeConverter<,>
和其他东西。我得到的最接近的是这个,但是 AutoMapper 抱怨 Id<>
不是引用类型,不能用作 System.Object
:
CreateMap(typeof(Id<>), long).ConvertUsing((s, d) => s.ToLong());
有什么建议如何做到这一点?有没有办法像 int -> string
、int -> 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());
我想将 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
。但到目前为止,这似乎是不可能的。我尝试了 TypeConverter
、ITypeConverter<,>
和其他东西。我得到的最接近的是这个,但是 AutoMapper 抱怨 Id<>
不是引用类型,不能用作 System.Object
:
CreateMap(typeof(Id<>), long).ConvertUsing((s, d) => s.ToLong());
有什么建议如何做到这一点?有没有办法像 int -> string
、int -> 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());