注意:此问题现在已过期,仅适用于旧版本的AutoMapper。此处提到的错误已修复。
问题:
我有一个AutoMapper转换器,它接受Nullable<bool>
/ bool?
并返回string
。我将此全局应用于我的个人资料,适用于true
和false
,但不适用于null
。
以下是我在AutoMapper个人资料中的内容:
CreateMap<bool?, string>()
.ConvertUsing<NullableBoolToLabel>();
这是转换器类:
public class NullableBoolToLabel : ITypeConverter<bool?, string>
{
public string Convert(bool? source)
{
if (source.HasValue)
{
if (source.Value)
return "Yes";
else
return "No";
}
else
return "(n/a)";
}
}
演示问题的示例
public class Foo
{
public bool? IsFooBarred { get; set; }
}
public class FooViewModel
{
public string IsFooBarred { get; set; }
}
public class TryIt
{
public TryIt()
{
Mapper.CreateMap<bool?, string>().ConvertUsing<NullableBoolToLabel>();
Mapper.CreateMap<Foo, FooViewModel>();
// true (succeeds)
var foo1 = new Foo { IsFooBarred = true };
var fooViewModel1 = Mapper.Map<Foo, FooViewModel>(foo1);
Debug.Print("[{0}]", fooViewModel1.IsFooBarred); // prints: [Yes]
// false (succeeds)
var foo2 = new Foo { IsFooBarred = false };
var fooViewModel2 = Mapper.Map<Foo, FooViewModel>(foo2);
Debug.Print("[{0}]", fooViewModel2.IsFooBarred); // prints: [No]
// null (fails)
var foo3 = new Foo { IsFooBarred = null };
var fooViewModel3 = Mapper.Map<Foo, FooViewModel>(foo3);
Debug.Print("[{0}]", fooViewModel3.IsFooBarred); // prints: []
// should print: [(n/a)]
}
}
问题:
答案 0 :(得分:0)
您是否需要为地图指定ConvertUsing?否则,我不知道它如何知道如何使用Foo类的IsFooBarred成员。但是我并不熟悉Mapper,也许它可以解决这个问题(在前两种情况下似乎确实如此)。
如果在转换中放置断点,它是否会在3种情况中的任何一种情况下被命中(在调试器中)?
答案 1 :(得分:0)
这是AutoMapper中的一个错误,并且已经修复。
自提出此问题以来,ITypeConverter
界面也发生了变化。转换器现在看起来像这样:
public class NullableBoolToLabel : ITypeConverter<bool?, string>
{
public string Convert(ResolutionContext context)
{
var source = (bool?)context.SourceValue;
if (source.HasValue)
{
if (source.Value)
return "Yes";
else
return "No";
}
else
return "(n/a)";
}
}