我有一个派生自System.Data.DataRow的源对象,如果底层值为DBNull,其字符串属性将在Get上抛出异常
private static void CreateMappings(IMapperConfiguration config)
{
config.CreateMap<SrcRow, DestDto>()
.ForMember(d => d.Error_Text, opt => opt.ResolveUsing(row =>
{
try
{
// the getter of this string property throws exception if internal value is DBNull
return row.error_text;
}
catch
{
return null;
}
}))
;
}
所有源和目标属性都是字符串。源对象是DataRow的包装器,每个属性都获取特定的行值。如果行值为DBNull值,则属性getter将引发异常。如何为目标类型的所有成员实现此代码,而不是为每个成员复制/粘贴此代码?
答案 0 :(得分:0)
执行此操作的一种方法是使用ForAllMembers()
方法并创建条件以仅在源不引发异常时映射值:
config.CreateMap<SrcRow, DestDto>().ForAllMembers(opts => opts.Condition(rc =>
{
try { return rc.SourceValue != null; } // Or anything, just try to get the value.
catch { return false; }
}));
答案 1 :(得分:0)
我相信Automapper提供了这个:
private static void CreateMappings(IMapperConfiguration config)
{
config.CreateMap<SrcRow, DestDto>()
.ForAllMembers(opt => opt.ResolveUsing(
...
); // or use opt.Condition()
}