Примечание: этот вопрос устарел и относится только к старым версиям 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)]
}
}
Вопросы:
- Это ошибка или по замыслу?
- Если это задумано, в чем причина его работы?
- Можете ли вы порекомендовать обходной путь?