Не могу привести GetTypes () к интерфейсам - PullRequest
2 голосов
/ 19 марта 2011

Я сканирую определенное пространство имен для типов, которые реализуют интерфейс, и пытаюсь вернуть их как этот интерфейс, а не просто Type, но я получаю InvalidCastException

IEnumerable<IGameScript> GetDemos()
{
    var results = Assembly.GetExecutingAssembly().GetTypes()
        .Where(
        x => x.IsClass 
        && x.Namespace == "MMOClass.CodeBase.Demos" 
        && x.Name.Contains("Demo") 
        && x.GetInterfaces().Contains(typeof(IGameScript))
        ).Select(x => x);

    return results.Cast<IGameScript>();
}

Обновлениев ответ на ответ Рида:

IEnumerable<IGameScript> GetDemos()
{
    var results = Assembly.GetExecutingAssembly().GetTypes()
        .Where(
        x => x.IsClass 
        && x.Namespace == "MMOClass.CodeBase.Demos" 
        && x.Name.Contains("Demo") 
        && x.GetInterfaces().Contains(typeof(IGameScript))
        ).Select(x => Activator.CreateInstance(x) as IGameScript);

    return results;
}

Ответы [ 2 ]

7 голосов
/ 19 марта 2011

Ваш запрос LINQ возвращает коллекцию типов (IEnumerable<System.Type>), которые реализуют интерфейс, а не коллекцию объектов этого типа.

Однако вы пытаетесь вернутьIEnumerable<IGameScript>, который будет списком экземпляров объектов, реализующих этот интерфейс.Вам нужно будет создать экземпляры для приведения к самому интерфейсу.

1 голос
/ 19 марта 2011

Предполагая, что у вас есть конструкторы по умолчанию, вы можете просто преобразовать свой вызов Select LINQ в что-то вроде этого и фактически получить экземпляры этого типа:

.Select(x => Activator.CreateInstance(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...