Поиск всех классов с определенным атрибутом - PullRequest
31 голосов
/ 06 апреля 2009

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

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

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

Ответы [ 2 ]

80 голосов
/ 06 апреля 2009
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;
 }
0 голосов
/ 27 октября 2017

Марк опубликовал хороший ответ, но вот бесплатная версия 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...