AutoMapper转换器因空值而失败

时间:2010-02-03 20:31:48

标签: c# automapper deprecated

注意:此问题现在已过期,仅适用于旧版本的AutoMapper。此处提到的错误已修复。


问题:

我有一个AutoMapper转换器,它接受Nullable<bool> / bool?并返回string。我将此全局应用于我的个人资料,适用于truefalse,但不适用于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 :(得分: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)";
    }
}