C# 自动映射转换器因空值而失败

C# 自动映射转换器因空值而失败,c#,automapper,deprecated,C#,Automapper,Deprecated,注意:这个问题现在已经过时,只适用于旧版本的AutoMapper。此处提到的错误已修复。 问题: CreateMap<bool?, string>() .ConvertUsing<NullableBoolToLabel>(); public class NullableBoolToLabel : ITypeConverter<bool?, string> { public string Convert(bool? source) {

注意:这个问题现在已经过时,只适用于旧版本的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)";
    }
}
我有一个自动映射转换器,它接受一个
可为空的
/
bool?
,并返回一个
字符串。我将其全局应用于我的配置文件,它适用于
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)";
    }
}
CreateMap()
.ConvertUsing();
下面是转换器类:

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)";
    }
}
公共类NullableBoolToLabel:ITypeConverter
{
公共字符串转换(bool?源)
{
if(source.HasValue)
{
if(source.Value)
返回“是”;
其他的
返回“否”;
}
其他的
返回“(不适用)”;
}
}
演示问题的示例

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)]
    }
}
公共类Foo
{
公共bool?IsFooBarred{get;set;}
}
公共类视图模型
{
公共字符串是禁止的{get;set;}
}
公共类TryIt
{
公共TryIt()
{
CreateMap().ConvertUsing();
CreateMap();
//正确(成功)
var foo1=newfoo{IsFooBarred=true};
var fooViewModel1=Mapper.Map(foo1);
Debug.Print(“[{0}]”,fooViewModel1.IsFooBarred);//prints:[是]
//错误(成功)
var foo2=new Foo{IsFooBarred=false};
var fooViewModel2=Mapper.Map(foo2);
Debug.Print(“[{0}]”,fooViewModel2.IsFooBarred);//prints:[否]
//空(失败)
var foo3=new Foo{IsFooBarred=null};
var fooViewModel3=Mapper.Map(foo3);
Debug.Print(“[{0}]”,fooViewModel3.IsFooBarred);//prints:[]
//应打印:[(不适用)]
}
}
问题:

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)";
    }
}
  • 这是一个bug还是出于设计
  • 如果它是设计的,那么它以这种方式工作的原因是什么
  • 你能推荐一个解决方法吗

  • 是否需要为地图指定一个转换器?否则,我不确定它如何知道如何使用Foo类的IsFooBarred成员。但我不熟悉地图绘制程序,也许它能解决这个问题(在前两种情况下似乎确实如此)


    如果在Convert中放置断点,在这3种情况下,它是否会被命中(在调试器中)?

    这是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)";
        }
    }
    
    公共类NullableBoolToLabel:ITypeConverter
    {
    公共字符串转换(ResolutionContext上下文)
    {
    var source=(bool?)context.SourceValue;
    if(source.HasValue)
    {
    if(source.Value)
    返回“是”;
    其他的
    返回“否”;
    }
    其他的
    返回“(不适用)”;
    }
    }
    
    不,这是一个bug,我在键入时正在查找它。这实际上是一个非常古老的问题。这是AutoMapper中的一个bug,不久前已修复。无论如何,谢谢你的回答:)