0

我正在使用 AutoMapper 2.2.1 将不同的业务对象映射到视图模型。现在我得到一个InvalidCastExceptions如果我尝试映射具有类型属性的对象CustomList(见下面的代码)。异常说CustomList不能强制转换为IList. 这是正确的,因为CustomListimplementsIReadOnlyList而不是IList.

那么为什么 automapper 试图以这种方式投射它以及如何修复/解决这个问题?

我有这些类型:

public class MyViewModel : SomeModel { //... some addtional stuff ...}

public class SomeModel {
public CustomList DescriptionList { get; internal set; }
}

public class CustomList : ReadOnlyList<SomeOtherModel> {}

public abstract class ReadOnlyList<TModel> : IReadOnlyList<TModel> {}

//map it
//aList is type of SomeModel 
var viewList = Mapper.Map<List<MyViewModel>>(aList);
4

1 回答 1

2

从 IReadOnlyList 实现您的类最有可能导致问题。Automapper 不知道如何将只读列表映射到只读列表。它创建对象的新实例,并且没有用于 IReadOnlyList 的 add 方法或集合初始值设定项。Automapper 需要能够访问只读列表所环绕的底层列表。这可以使用 ConstructUsing 方法来完成。

更新列表模型:

public class CustomList : IReadOnlyList<string>
{
    private readonly IList<string> _List;

    public CustomList (IList<string> list)
    {
        _List = list;
    }

    public CustomList ()
    {
        _List = new List<string>();
    }

    public static CustomList CustomListBuilder(CustomList customList)
    {
        return new CustomList (customList._List);
    }
}

更新了自动映射器配置

Mapper.CreateMap<CustomList, CustomList>().ConstructUsing(CustomList.CustomListBuilder);

这是一个简单的例子,但我能够让它正确映射并且不抛出异常。这不是最好的代码,这样做会导致同一个列表被两个不同的只读列表引用(取决于您的要求,可能会也可能不会)。希望这会有所帮助。

于 2013-08-08T17:25:22.087 回答