Изменить значение атрибута в производном классе? - PullRequest
3 голосов
/ 23 апреля 2010

У меня есть свойство в базовом классе, помеченное атрибутами, и я хотел бы изменить некоторые атрибуты в каждом из моих производных классов. Каков наилучший способ сделать это?

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

Это упрощенный пример того, что я пытаюсь сделать. Я хочу изменить MyAttribute в производных классах, но сохранить все остальные атрибуты свойства одинаковыми и определенными в одном месте (т.е. я не хочу переопределять XmlElement более одного раза). Это вообще возможно? Или есть лучший способ сделать это? Или я здесь совершенно неправильно использую атрибуты?

using System;  
using System.Xml;  
using System.Xml.Serialization;

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class MyAttribute : System.Attribute  
{  
    public MyAttribute() {}

    public string A { get; set; }

    public string B { get; set; }
}

public abstract class BaseClass  
{  
    public BaseClass() {}

    [XmlElement("some_property")]
    [MyAttribute(A = "Value1", B = "Value2")]
    public string SomeProperty { get; set; }
}

public class FirstDerivedClass : BaseClass  
{  
    //I want to change value B to something else  
    //in the MyAttribute attribute on property SomeProperty  
}

public class SecondDerivedClass : BaseClass  
{  
    //I want to change value B to yet another value  
    //in the MyAttribute attribute on property SomeProperty  
}

1 Ответ

0 голосов
/ 23 апреля 2010

Вы можете использовать метод GetCustomAttributes для возврата либо всех атрибутов на всех уровнях наследования, либо только реализованного класса. К сожалению, это не позволит вам переопределить атрибут «AllowMultiple = false». Возможно, вы могли бы создать метод, который вызывает GetCustomAttribute дважды, один раз с унаследованными значениями и один раз без. Тогда вы можете дать предпочтение ненаследуемым значениям по сравнению с наследуемыми значениями. При необходимости могу выложить образец позже.

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