IQueryable <T>приведение к IList <SpecificInterface> - PullRequest
3 голосов
/ 23 февраля 2011

Настройка

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 ]

3 голосов
/ 23 февраля 2011

Для .NET 3.5 вы можете использовать это:

return new GridModel(table.ToList().ConvertAll(x => (ITable)x));
1 голос
/ 23 февраля 2011

Если это .NET 4.0, вы можете прочитать об общей ковариации и контравариантности .

0 голосов
/ 23 февраля 2011

Вы также можете использовать метод расширения LINQ Cast ():

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

, что немного яснее.

Также, когда это возможно, часто лучше использовать IEnumerable вместо IList.

...