【问题标题】:How to map an ICollection<T> to Class derived from List<T>如何将 ICollection<T> 映射到派生自 List<T> 的类
【发布时间】:2019-06-12 17:59:29
【问题描述】:

我正在我的模型和我的视图模型之间建立映射,并且我正在尝试从 ICollection 映射到派生自 List 的类

我尝试在我的 ListItemClassVM 和 ICollection 之间进行映射,但收到错误“参数类型不匹配”

选项一映射适用于此:

public class ParentVM
{
    public List<ListItemClass> ListItemClasses { get; set; }
}

选项二映射不起作用:

public class ParentVM
{
    public ListItemClassVM ListItemClasses { get; set; }
}

public ListItemClassVM : List<ListItemClass>
{

}

映射设置:

public ModelClass_ParentVM_Profile()
    {
        CreateMap<ModelClass, ParentVM>()
            .ForMember(d => d.ListItemClasses, o => o.MapFrom(i => i.ModelCollection))
            ;

        CreateMap<ParentVM, ModelClass>()
            ;

    }

尝试设置映射,以便选项二将映射。

【问题讨论】:

  • 如果你能帮忙的话,我会从List&lt;T&gt; 发给advise against deriving
  • @John 你能解释一下为什么吗?当您必须扩展 List 时,从 List 派生是唯一可维护的解决方案。
  • @user 很大程度上是因为我觉得这样做通常是为了存储与列表项相关的信息。例如,Person/Jobs 关系不应表示为 public class Person: List&lt;Job&gt; { public string Name { get; set; } },因为 Person 不仅仅是工作列表。一个人可以有工作,但他们不是工作。诚然,OP 可能不会这样做,但这通常是人们所做的,正如链接帖子中@m-y 所建议的那样,如果 OP 真的想扩展它,OP 可以从 Collection 继承。
  • @John 好吧,我明白你的意思。
  • @john 感谢链接有趣的阅读不知道这可能会导致性能问题。我看到这个的主要原因是我的一个轻微误解我正在考虑制作一个 MVC 编辑器模板并认为 EditorFor Linked 在模型类型(它不是它的属性名称)上并且认为 List/Collection 给出了一个问题。现在我很好奇为什么 Automapper 认为这种设置与众不同。

标签: c# automapper


【解决方案1】:

我认为有更多方法可以解决问题,但是您无法摆脱从 ICollection 到 ListItemClassVM 的手动换位。 更简单的方法可能是向您的 ListItemClassVM 添加一个接受 ICollection 并使用 ICollection 中的元素初始化自身的构造函数,然后您可以执行以下操作:

 CreateMap<ModelClass, ParentVM>()
        .ForMember(d => d.ListItemClasses, o => o.MapFrom(i =>new ListItemClassVM (i.ModelCollection)))
        ;

【讨论】:

    猜你喜欢
    • 2016-05-26
    • 2016-07-06
    • 1970-01-01
    • 2014-01-22
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多