Явная загрузка dll нарушает поиск перечислений с пользовательским атрибутом - PullRequest
1 голос
/ 03 мая 2020

У меня есть 3 простых проекта. Все проекты ориентированы на платформу net4.8. Для Net Core 3.1) проблем нет.

  1. Первый проект ( CommonDomain.dll ) содержит определение пользовательского атрибута:

    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
    public class HumanReadableNameAttribute 
         : Attribute
    {
        public HumanReadableNameAttribute(string humanReadableName)
        {
            HumanReadableName = humanReadableName;
        }
    
        public HumanReadableNameAttribute()
        { }
    
        public string HumanReadableName { get; set; }
        public string Comment { get; set; }
    }
    
  2. Второй проект ( Example.dll ) содержит определение перечисления, поля которого используют этот атрибут

    public enum ChildEnum
    {
       [HumanReadableName]
       One = 0,
       [HumanReadableName]
       Two = 1,
       [HumanReadableName]
       Three = 2,
       [HumanReadableName]
       Four = 3
    }
    
  3. Последний проект содержит код, который определяет перечисления, чьи поля используют наш атрибут. Я использую IsDefined метод для обнаружения. В проекте есть ссылки на вышеуказанные проекты.

Сначала я написал простой и понятный код, который отлично работает

string[] assemblyPath = { 
               @"Example.dll" 
            };

var assemblies = assemblyPath.Select(g => Assembly.LoadFrom(g));
var types = assemblies.SelectMany(g => g.GetTypes()).Select(g => g).ToArray();
var enums = types.Where(t => t.GetFields().Any(f => f.IsDefined(typeof(HumanReadableNameAttribute), false)));

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

Теперь я дополнительно загружу саму сборку, которая содержит определение пользовательского атрибута.

 string[] assemblyPath = { 
           @"CommonDomain.dll" // loading the assembly with attribute definition
           @"Example.dll" 
        };

 var assemblies = assemblyPath.Select(g => Assembly.LoadFrom(g));
 var types = assemblies.SelectMany(g => g.GetTypes()).Select(g => g).ToArray();
 var enums = types.Where(t => t.GetFields().Any(f => f.IsDefined(typeof(HumanReadableNameAttribute), false)));

Это изменение прерывает поиск по перечислениям. Коллекция enums теперь пуста. Я очень удивлен

Почему? Как загрузка сборки с определением пользовательского атрибута влияет на метод IsDefined?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...