3

设置

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了我应该能够将 myList<Company>转换为IList<ITable>但是它不想工作,因为它实际上是T. 但是T在函数定义中被限制为ITable. 我在这里做错了什么?当我不使用泛型时,设置工作得很好。但是我想要一个通用设置,因为我一直在一遍又一遍地编写相同的代码 - 这很糟糕:)

任何帮助将不胜感激。即使你告诉我是做不到的。

4

3 回答 3

3

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

return new GridModel(table.ToList().ConvertAll(x => (ITable)x));
于 2011-02-23T20:16:44.390 回答
1

如果这是 .NET 4.0,您可以阅读有关泛型协变和逆变的信息。

于 2011-02-23T20:15:14.003 回答
0

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

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

这更清楚一点。

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

于 2011-02-23T20:21:26.527 回答