0

我有一个IndexModel基类,用于几乎所有构建实体索引表的视图模型:

public class IndexModel<TIndexItem, TEntity> : ViewModel
        where TIndexItem : MappedViewModel<TEntity>, new()
        where TEntity : new()
    {
        public IndexModel()
        {
            Items = new List<TIndexItem>();
        }

        public TIndexItem TemplateItem { get; set; }
        public List<TIndexItem> Items { get; set; }

        public virtual void MapFromEntityList(IEnumerable<TEntity> entityList)
        {
            Items = Mapper.Map<IEnumerable<TEntity>, List<TIndexItem>>(entityList);
        }
    }

我觉得TEntity参数是不必要的,就像TIndexItemtype一样MappedViewModel<TEntity>。我的问题是双重的:

  1. 我需要动态调用MapFromEntityList,使用反射来确定是什么TEntity。构造IEnumerable<TEntity>参数相当简单,但Mapper.Map<IEnumerable<TEntity>, List<TIndexItem>>(entityList)调用是一个挑战。如何使用动态构建的类型参数调用 map?

  2. 我的班级有约束where : MappedViewModel<TEntity>, new()。这不是一个太大的问题,因为我可以让这个不太具体,例如where TIndexItem : ViewModel, new()ViewModel我的所有视图模型的“无类型”基类在哪里。然后我只能做一些TEntity特定的事情,比如映射调用 if TIndexItemis a MappedViewModel<TEntity>

4

1 回答 1

1

我想这就是你所追求的:

public class IndexModel<TEntity> : ViewModel
    where TEntity : new()
{
    public IndexModel()
    {
        Items = new List<MappedViewModel<TEntity>>();
    }

    public MappedViewModel<TEntity>TemplateItem { get; set; }
    public List<MappedViewModel<TEntity>> Items { get; set; }

    public virtual void MapFromEntityList(IEnumerable<TEntity> entityList)
    {
        Items = Mapper.Map<IEnumerable<TEntity>, List<MappedViewModel<TEntity>>>(entityList);
    }

}
于 2013-02-10T07:40:09.080 回答