TypeDescriptor.AddAttributes () заменяет текущий атрибут вместо его добавления - PullRequest
1 голос
/ 22 октября 2010

У меня есть эта часть кода:

var hasAttribute = TypeDescriptor.GetAttributes(property.DeclaringType).OfType<CrmTypeAttribute>()
            .Any((attr)
                    => ((CrmTypeAttribute)attr).Name == property.Name);

            if (!hasAttribute)
            {
                var crmTypeAttribute = new CrmTypeAttribute(property.Name, crmType);
                TypeDescriptor.AddAttributes(property.DeclaringType, crmTypeAttribute);
            }

У него есть две проблемы:

  1. По какой-то причине OfType возвращает пустой IEnumerable, хотя он должен возвращать правильные атрибуты этоготипа, и я проверил.Они существуют.
  2. Это серьезная проблема.Вместо добавления атрибута он заменяет старый атрибут того же типа на crmTypeAttribute. Я пометил AllowMultiple как true.

Может кто-нибудь сказать мне, что не так с этим кодом?
EDIT:
По какой-то причине он позволяет добавлять только один атрибуттипа атрибута, я добавил другой тип атрибута во время выполнения, и он работал.

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Я думаю, что ваша проблема связана с тем, что вы игнорируете возвращенный TypeDescriptionProvider из AddAttributes вызова.

От Отражателя на TypeDescriptor.AddAttributes:

Добавляет атрибуты уровня класса к типу целевого компонента.

Параметры

type : Type целевого компонента.

атрибутов : массив Attribute объектов для добавления в класс компонента.

Возвращаемое значение : недавно созданный TypeDescriptionProvider, который использовался дляДобавьте указанные атрибуты.

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

0 голосов
/ 22 октября 2010

Оказывается, что атрибут должен переопределять свойство TypeId класса Attribute, чтобы не рассматриваться как дублированный.
См. здесь для получения подробной информации, он очень скрыт и должен быть упомянут в GetAttributes.

...