2013-02-10 90 views
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參數是不必要的,因爲TIndexItemMappedViewModel<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特定的東西,如地圖調用,如果TIndexItemMappedViewModel<TEntity>

回答

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); 
    } 

} 
+0

如此簡單,卻又如此難以捉摸。樹木等。謝謝。 – ProfK 2013-02-12 18:26:57

+0

np,有時候所有你需要的是另一雙眼睛:)尤其是當你一次又一次看過同樣的東西時 – user1416420 2013-02-12 19:21:50

+0

不幸的是我之前沒有嘗試過這種方法,但是它後面會解釋一些缺陷,所以我必須撤回我的接受。儘管你仍然非常接近,但你仍然有一個點。 – ProfK 2013-03-17 09:25:12

相關問題