簡體   English   中英

IQueryable的 <T> 施加到IList <SpecificInterface>

[英]IQueryable<T> cast to IList<SpecificInterface>

建立

public interface ITable { }

public class Company : ITable {
    public int Id { get; set; }
    public string Name { get; set; }
}

public class PaginationGridModel {

    public PaginationGridModel(IList<ITable> rows) {
        //cool stuff goes here
    }
}

public GridModel GenerateModel<T>(IQueryable<T> Table) where T : ITable {
    return new GridModel((IList<ITable>)Table);
}

//Actual Call
return GenerateModel<Company>(this.dataContext.Companies);

生成異常

Unable to cast object of type 'System.Collections.Generic.List`1[Company]' to type 'System.Collections.Generic.IList`1[ITable]'.

由於Company實施ITable我應該能夠將我的List<Company>轉換為IList<ITable>但是它不想工作,因為它實際上是T 但是T在函數定義中受限於ITable 我在這做錯了什么? 當我不使用Generics時,設置工作正常。 但是我想要一個Generic設置,因為我一直在編寫相同的代碼 - 這很糟糕:)

任何幫助將不勝感激。 即使你告訴我的是它無法完成。

對於.NET 3.5,您可以使用:

return new GridModel(table.ToList().ConvertAll(x => (ITable)x));

如果這是.NET 4.0,您可以閱讀有關通用協方差和逆變的信息

您還可以使用LINQ Cast()擴展方法:

return new GridModel((IList<ITable>)Table.Cast<T>());

哪個更清楚一點。

此外,在可能的情況下使用IEnumerable而不是IList通常更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM