我刚开始使用C#中的AutoMapper.我成功地创建了这样的映射:
Mapper.CreateMap<InputTypeA, OutputTypeA>()
Run Code Online (Sandbox Code Playgroud)
我还找到了一种方法来为特定属性添加一些逻辑,比如将日期(在InputTypeA中)格式化为特定格式的字符串(在OutputTypeA中).
.ForMember(
dest => dest.MyDateProperty,
opt => opt.ResolveUsing(
src => String.Format("{0:yyyy-MM-dd}", src.MyDateProperty)));
Run Code Online (Sandbox Code Playgroud)
现在我需要为一些浮动属性做同样的事情,但是我想知道是否有一个简短的方法来做到这一点,除了为每个需要遵循这条规则的属性复制上面的一段代码.
我发现我可以创建一个这样的新映射,用于将浮点数映射到字符串:
Mapper.CreateMap<float,string>()
.ConvertUsing(src =>
String.Format(CultureInfo.InvariantCulture.NumberFormat, "{0:0.00}", src));
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是太通用了,因为我还有另一种类型的映射(让我们称之为InputTypeB),它也包含浮动属性,需要区别对待.
Mapper.CreateMap<InputTypeB, OutputTypeB>()
Run Code Online (Sandbox Code Playgroud)
如何才能使float-to-string映射成为第一个映射的一部分?
您可以基于两个单独的配置创建两个单独的映射器,其中只有一个包含浮点到字符串的映射:
public class InputTypeA { public float Foo { get; set; } }
public class OutputTypeA { public string Foo { get; set; } }
public class InputTypeB { public float Bar { get; set; } }
public class OutputTypeB { public string Bar { get; set; } }
public class Program
{
public static void Main(string[] args)
{
Func<float, string> mapFunc =
src => String.Format(CultureInfo.InvariantCulture.NumberFormat, "{0:0.00}", src);
var floatToStringConfig = new MapperConfiguration(cfg =>
{
cfg.CreateMap<InputTypeA, OutputTypeA>();
cfg.CreateMap<float, string>().ConvertUsing(mapFunc);
});
var regularConfig = new MapperConfiguration(cfg =>
{
cfg.CreateMap<InputTypeB, OutputTypeB>();
});
IMapper floatToStringMapper = floatToStringConfig.CreateMapper();
IMapper regularMapper = regularConfig.CreateMapper();
var aIn = new InputTypeA() { Foo = 1f };
var aOut = floatToStringMapper.Map<OutputTypeA>(aIn);
Console.WriteLine(aOut.Foo); // prints "1.00"
var bIn = new InputTypeB() { Bar = 1f };
var bOut = regularMapper.Map<OutputTypeB>(bIn);
Console.WriteLine(bOut.Bar); // prints "1"
}
}
Run Code Online (Sandbox Code Playgroud)