Automapper可以忽略void方法吗?

时间:2013-06-21 20:20:29

标签: automapper

我是Automapper的新手,所以我不确定这是否可行。

我想映射一个类,但要忽略无效的方法。下面是我所拥有的代码的说明。当我运行它时,我收到以下异常消息。

  

“AutoMapper.AutoMapperMappingException”类型的未处理异常   发生在AutoMapper.dll

不幸的是,它不是一个更改界面的选项,所以我假设如果可能的话,我会缺少某种配置?

public interface IThing
{
    string Name { get; set; }
    void IgnoreMe();
}

public class Foo : IThing
{
    public string Name { get; set; }

    public void IgnoreMe()
    {
    }
}

class Program
{
    static void Main(string[] args)
    {
        var fooSource = new Foo {Name = "Bobby"};
        Mapper.CreateMap<IThing, IThing>();

        var fooDestination = Mapper.Map<IThing>(fooSource);
        Console.WriteLine(fooDestination.Name);
        Console.ReadLine();
    }
}

1 个答案:

答案 0 :(得分:8)

如果您使用的是an interface as a destination类型,AutoMapper将为您动态创建一个实现(代理)类型。

然而代理生成仅支持属性,因此它会为您的IgnoreMe方法抛出这个不太具描述性的异常。因此,您无法忽略IgnoreMe方法。

作为一种解决方法,您可以明确指定如何使用ConstructUsing重载中的一个来构造目标对象,在这种情况下,AutoMapper不会生成代理。

Mapper.CreateMap<IThing, IThing>()
      .ConstructUsing((ResolutionContext c) => new Foo());

除非您没有充分的理由,否则您可以直接映射到Foo

Mapper.CreateMap<IThing, Foo>();