Подтвердить что ты не робот

Поиск всех классов с определенным атрибутом

У меня есть библиотека .NET, в которой мне нужно найти все классы, у которых есть пользовательский атрибут, который я определил на них, и я хочу, чтобы их можно было найти "на лету", когда приложение используя мою библиотеку (т.е. я не хочу, чтобы файл конфигурации где-то, где я указываю сборку, чтобы посмотреть и/или имена классов).

Я смотрел на AppDomain.CurrentDomain, но я не слишком хорошо разбираюсь в этом и не уверен, каким образом должны быть привилегированные привилегии (я хочу иметь возможность запускать библиотеку в веб-приложении с минимальным доверием, если это возможно, но тем ниже доверие, которым я был бы счастливее). Я также хочу помнить о производительности (это библиотека .NET 3.5, так что LINQ полностью работоспособен!).

Итак, AppDomain.CurrentDomain мой лучший/единственный вариант, а затем просто перебирает все сборки, а затем вводит их в эти сборки? Или есть другой способ

4b9b3361

Ответ 1

IEnumerable<Type> GetTypesWith<TAttribute>(bool inherit) 
                              where TAttribute: System.Attribute
 { return from a in AppDomain.CurrentDomain.GetAssemblies()
          from t in a.GetTypes()
          where t.IsDefined(typeof(TAttribute),inherit)
          select t;
 }

Ответ 2

Отметьте хороший ответ, но вот свободная версия linq, если вы предпочитаете:

    public static IEnumerable<Type> GetTypesWith<TAttribute>(bool inherit) where TAttribute : Attribute
    {
        var output = new List<Type>();

        var assemblies = AppDomain.CurrentDomain.GetAssemblies();

        foreach (var assembly in assemblies)
        {
            var assembly_types = assembly.GetTypes();

            foreach (var type in assembly_types)
            {
                if (type.IsDefined(typeof(TAttribute), inherit))
                    output.Add(type);
            }
        }

        return output;
    }