Использование отражения для получения каждого экземпляра XmlElementAttribute для одного свойства

#c# #.net #serialization #reflection #allowmultiple

#c# #.net #сериализация #отражение #разрешить множественное

Вопрос:

Я пытаюсь перечислить возможные типы, которые может содержать элемент. Однако я застрял в том, что не могу вызвать Item.GetType() для перебора его атрибутов, поскольку это просто вернет атрибуты того типа, который он уже содержал.

Я попробовал TypeDescriptor.GetProperties(…) но контейнер атрибутов содержит только один экземпляр XmlElementAttribute, который является последним, примененным к свойству (в данном случае WindowTemplate)

Это должно быть тривиально, но я не могу найти какое-либо решение моей проблемы в Интернете.

     [System.Xml.Serialization.XmlElementAttribute("ChildTemplate", typeof(ChildTmpl), Order = 1)]
    [System.Xml.Serialization.XmlElementAttribute("WindowTmeplate", typeof(WindowTmpl), Order = 1)]
    public object Item
    {
        get
        {
            return this.itemField;
        }
        set
        {
            this.itemField = value;
        }
    }
  

Ответ №1:

Вы не можете использовать TypeDescriptor для этого, как System.ComponentModel всегда сворачивает атрибуты. Вы должны использовать PropertyInfo и Attribute.GetCustomAttributes(property, attributeType) :

 var property = typeof (Program).GetProperty("Item");
Attribute[] attribs = Attribute.GetCustomAttributes(
       property, typeof (XmlElementAttribute));
  

массив фактически будет XmlElementAttribute[] , если это упростит задачу:

 XmlElementAttribute[] attribs = (XmlElementAttribute[])
     Attribute.GetCustomAttributes(property, typeof (XmlElementAttribute));
  

Комментарии:

1. Большое вам спасибо! Работает отлично.