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