1

注意:这个问题现在已经过时了,只适用于旧版本的 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. 你能推荐一个解决方法吗?
4

2 回答 2

0

您需要为地图指定一个 ConvertUsing 吗?否则,我不确定它如何知道如何使用 Foo 类的 IsFooBarred 成员。但我对 Mapper 并不熟悉,也许它可以解决这个问题(在前两种情况下似乎确实如此)。

如果您在 Convert 中放置一个断点,它是否会在 3 种情况中的任何一种中被命中(在调试器中)?

于 2010-02-04T04:23:49.603 回答
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)";
    }
}
于 2012-08-30T21:50:35.850 回答