У меня есть 3 простых проекта. Все проекты ориентированы на платформу net4.8. Для Net Core 3.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; }
}
Второй проект ( Example.dll ) содержит определение перечисления, поля которого используют этот атрибут
public enum ChildEnum
{
[HumanReadableName]
One = 0,
[HumanReadableName]
Two = 1,
[HumanReadableName]
Three = 2,
[HumanReadableName]
Four = 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?