2015-04-20 76 views
0

我想投一個清單是ProjectList演員對象

我的自定義列表
IList<Project> projects = cm.GetOrAdd("projectList",() => (ProjectList)ProjectService.GetAllProjects().ToList(), new CacheItemPolicy(5)); 

ProjectList只包含:

public class ProjectList : List<Project> 
{ 
    public override string ToString() 
    { 
     return string.Format("Projects: {0}", this.Count()); 
    } 
} 

但是它給一個運行時錯誤,它不能投擲物體。

錯誤:

System.Collections.Generic.List`1[sidc.Framework.Data.Entities.Project] can't be converted to type sidc.Framework.Web.Helpers.ProjectList.

上午我監督什麼?我正在使用lambda,因爲當對象不在緩存中時,我的cm(CacheManager)將評估Func<>

+0

'(ProjectList)ProjectService.GetAllProjects()ToList()'應該是'。 (List )ProjectService.GetAllProjects()。ToList()' –

+0

@DZL這樣做不起作用,因爲你不能將'List '轉換成'List '。 – juharr

+0

您能更具體地瞭解您不清楚的內容嗎?這個劇組簡直是無效的。 – usr

回答

3

您不能將List<T>降頻爲從List<T>繼承的任何類型,因爲運行時無法爲您填充空白。它不會知道如何從「動物」中創建「狗」。這就是編譯器試圖告訴你的。

添加接受的Project可枚舉構造,並與該列表填充自身:

public class ProjectList : List<Project> 
{ 
    public ProjectList() { } 
    public ProjectList(IEnumerable<Project> projects) 
     : this() 
    { 
     this.AddRange(projects); 
    } 

    public override string ToString() 
    { 
     return string.Format("Projects: {0}", this.Count()); 
    } 
} 

然後改變你的拉姆達從:

() => (ProjectList)ProjectService.GetAllProjects().ToList() 

要:

() => new ProjectList(ProjectService.GetAllProjects()) 

但通過引入一個具體類型(ProjectListList<Project>)你幾乎消滅了泛型的使用:不必爲每個記錄類型指定一個類型。你可能根本不需要ProjectList

+0

ProjectList的唯一原因是使用overbound ToString方法。 – Martin

+0

根據你需要的原因,你可以用不同的方式解決它。 – CodeCaster

+0

Mu cachemanager接受任何類型的對象。我有一個緩存管理器調試頁面,顯示有關對象的更多信息。這就是我使用tostring的地方,因爲調試頁面瞭解關於對象的任何信息 – Martin

0

這只是繼承是如何工作的 - 你可以施放ProjectListList<Project>,而不是其他的方式 - List<Project>類型不是ProjectList