IQueryable <t>强制转换为IList <specificinterface> </specificinterface> </t>

时间:2011-02-23 20:12:39

标签: c# casting entity-framework-ctp5

设置

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设置,因为我一直在编写相同的代码 - 这很糟糕:)

非常感谢任何帮助。即使你告诉我的是它无法完成。

3 个答案:

答案 0 :(得分:3)

对于.NET 3.5,您可以使用:

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

答案 1 :(得分:1)

如果这是.NET 4.0,您可以阅读有关通用covariance and contravariance

的内容

答案 2 :(得分:0)

您还可以使用LINQ Cast()扩展方法:

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

更清楚一点。

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