Обработка ошибок с помощью «Получение всех типов, которые реализуют интерфейс с C # 3.0» - PullRequest
2 голосов
/ 17 октября 2011

У меня есть метод в библиотеке классов, который сканирует все загруженные сборки для типов, которые реализуют определенный интерфейс, например Получение всех типов, реализующих интерфейс .

var type = typeof(IMyInteraface);
var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
    .SelectMany(s => s.GetTypes())
    .Where(p => type.IsAssignableFrom(p));

При установкебиблиотеку классов в проекты, я иногда сталкиваюсь с FileNotFoundException как:

Не удалось загрузить файл или сборку 'AAA.BBB.CCC, Версия = 1.2.3.4, Культура = нейтральная, PublicKeyToken = abcdef0123456789a'или одна из его зависимостей.Система не может найти указанный файл.

Я хочу переписать запрос LINQ во что-то более безопасное от ошибок.Для моих целей, если сборка не может быть загружена, мне не нужно беспокоиться о попытке загрузить любой тип, который ей принадлежит.Как это сделать?

1 Ответ

2 голосов
/ 17 октября 2011

Вы всегда можете разложить LINQ на вложенные циклы foreach и добавить множество блоков try-catch, игнорируя любую сборку и любой тип, который выдает ошибку.

var interfaceType = typeof(IMyInterface);
var types = new List<Type>();
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) {
    try {
        foreach (var type in assembly.GetTypes()) {
            try {
                if (interfaceType.IsAssignableFrom(type))
                    types.Add(type);
            } catch (FileNotFoundException) {}
        }
    } catch (FileNotFoundException) {}
}
...