Атрибут (ы) - Сравнение - PullRequest
       0

Атрибут (ы) - Сравнение

0 голосов
/ 12 февраля 2012

В настоящее время у меня есть объявление в корневом классе, которое выполняет итерацию по свойствам производного класса и создает экземпляр значения по умолчанию для свойства, используя дескриптор DefaultValueAttribute.То, что я хочу сделать, это расширить это от просто для DefaultValue, чтобы также быть XmlElement, XmlAttribute и серией атрибутов, включенных в сериализацию пространства имен Xml.

У меня проблема с расширением текущего дизайна дообрабатывать несколько атрибутов без загрузки тонны операторов if / then / else для обработки различных определенных атрибутов.

Текущий дизайн:

private void Initialize () {
  foreach( PropertyDescriptor property in TypeDescriptor.GetProperties( this ) ) {
    XmlElementAttribute xel = ( XmlElementAttribute ) property.Attributes[typeof( XmlElementAttribute )];
    if( xel != null ) {
      this.AddElement( xel.ElementName , "" );
    }
    DefaultValueAttribute attr = ( DefaultValueAttribute ) property.Attributes[typeof( DefaultValueAttribute )];
    if( attr != null ) {
      property.SetValue( this , attr.Value );
    }
  }
}

Предложения Дизайн:

private void Initialize () {
  foreach( PropertyDescriptor property in TypeDescriptor.GetProperties( this ) ) {
    foreach( Attribute attr in property.Attributes ) {
      if( attr = typeof(XmlElementAttribute)){
        //do something
      }else if(attr = typeof(DefaultValueAttribute)){
        //do something
      }
    }
  }
}

1 Ответ

1 голос
/ 12 февраля 2012

Вы можете определить Dictionary<Type, Action<object>> (или заменить object конкретным типом вашего класса) и добавить код, который вы хотите выполнить для каждого типа:

var dict = new Dictionary<Type, Action<object>>();
dict.Add(typeof(XmlElementAttribute), obj =>
{
  //do something
});

Теперь вы можете просто проверить, содержит ли ваш словарь тип и выполнить делегат:

foreach(Attribute attr in property.Attributes) 
{  
   var attributeType = attr.GetType();
   if(dict.ContainsKey(attributeType))
   {
     dict[attributeType](this);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...