AutoMapper如何在获取抛出异常的属性时忽略异常?

时间:2016-04-08 18:37:48

标签: c# automapper

我有一个派生自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将引发异常。如何为目标类型的所有成员实现此代码,而不是为每个成员复制/粘贴此代码?

2 个答案:

答案 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()
}