Преобразователи AutoMapper не работают для нулевых значений - PullRequest
1 голос
/ 03 февраля 2010

Примечание: этот вопрос устарел и относится только к старым версиям 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)]
    }
}

Вопросы:

  1. Это ошибка или по замыслу?
  2. Если это задумано, в чем причина его работы?
  3. Можете ли вы порекомендовать обходной путь?

Ответы [ 2 ]

0 голосов
/ 31 августа 2012

Это ошибка в 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)";
    }
}
0 голосов
/ 04 февраля 2010

Вам нужно указать ConvertUsing для карты? В противном случае я не уверен, как он узнает, как использовать член IsFooBarred класса Foo. Но я не знаком с Картографом, и, возможно, он сможет это выяснить (похоже, в первых двух случаях).

Если вы установите точку останова в Convert, получится ли она (в отладчике) в любом из 3 случаев?

...