将不同的具体类型映射到接口集合
Map Different Concrete Types to Collection of Interface
我很难将不同的具体类型映射到自动映射器中的单个接口集合。例如:
域:
public interface INameInterface {
string Name;
}
public class FullName: INameInterface {
string Name;
}
public class FirstNameOnly: INameInterface {
string Name;
}
public class MyDomain {
List<INameInterface> Names;
}
DTO:
public class NameDTO {
int NameType;
string Name;
}
public class MyDTO {
List<NameDTO> NameDTOs;
}
我想将 MyDTO 映射到 MyDomain。我想通过其 NameType 解析 NameDTO 并将 NameTypes 1 映射到 Fullname 并将 2 映射到 FirstNameOnly 具体 类 并将它们放在 MyDomain.Names 集合中。我怎样才能在自动映射器中做到这一点。
非常感谢任何帮助。
PS。示例已简化
这可以使用自定义类型转换器解决。
在自动映射器配置中:
cfg.CreateMap<NameDTO, INameInterface>()
.ConvertUsing<SomeConverter>();
然后创建自定义转换器class。
public class SomeConverter : ITypeConverter<NameDTO, INameInterface>
{
public INameInterface Convert(NameDTO source, INameInterface destination, ResolutionContext context)
{
if (source.NameType == 0)
{
return context.Mapper.Map<FullName>(source);
}
if (source.NameType == 1)
{
return context.Mapper.Map<FirstNameOnly>(source);
}
return context.Mapper.Map<FirstNameOnly>(source);
}
}
只需为每个具体类型添加必要的映射。
警告,我曾尝试在投影中使用这种方法,但这行不通,因为它无法转换为表达式。
我很难将不同的具体类型映射到自动映射器中的单个接口集合。例如:
域:
public interface INameInterface {
string Name;
}
public class FullName: INameInterface {
string Name;
}
public class FirstNameOnly: INameInterface {
string Name;
}
public class MyDomain {
List<INameInterface> Names;
}
DTO:
public class NameDTO {
int NameType;
string Name;
}
public class MyDTO {
List<NameDTO> NameDTOs;
}
我想将 MyDTO 映射到 MyDomain。我想通过其 NameType 解析 NameDTO 并将 NameTypes 1 映射到 Fullname 并将 2 映射到 FirstNameOnly 具体 类 并将它们放在 MyDomain.Names 集合中。我怎样才能在自动映射器中做到这一点。
非常感谢任何帮助。
PS。示例已简化
这可以使用自定义类型转换器解决。
在自动映射器配置中:
cfg.CreateMap<NameDTO, INameInterface>()
.ConvertUsing<SomeConverter>();
然后创建自定义转换器class。
public class SomeConverter : ITypeConverter<NameDTO, INameInterface>
{
public INameInterface Convert(NameDTO source, INameInterface destination, ResolutionContext context)
{
if (source.NameType == 0)
{
return context.Mapper.Map<FullName>(source);
}
if (source.NameType == 1)
{
return context.Mapper.Map<FirstNameOnly>(source);
}
return context.Mapper.Map<FirstNameOnly>(source);
}
}
只需为每个具体类型添加必要的映射。
警告,我曾尝试在投影中使用这种方法,但这行不通,因为它无法转换为表达式。