如何使用动态确定的类型参数调用泛型方法?

时间:2013-02-10 06:45:43

标签: c# asp.net-mvc generics reflection asp.net-mvc-4

我有一个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参数是不必要的,因为TIndexItem的类型为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是我所有视图模型的“无类型”基类。然后,如果TEntityTIndexItem,我只能执行映射调用等MappedViewModel<TEntity>特定内容。

1 个答案:

答案 0 :(得分: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);
    }

}