Можете ли вы получить объединенные атрибуты для класса в C #? - PullRequest
1 голос
/ 07 февраля 2010

Скажите, у меня есть следующий набор классов, возможно ли объединение атрибутов DerivedClass? В настоящее время, если я использую метод GetType (). GetCustomAttributes (), передавая true для наследования, он принимает самые высокие атрибуты в структуре наследования.

т.е. [Другой («Боб»)] и [Мой (16)]

Возможно ли объединение атрибутов? Таким образом, я получу два атрибута [My (16, "Male")] и [Another ("Bob")]

Я не хочу сказать, что я бы указывал атрибут [My (16, "Male")], а скорее мне вернули бы атрибут с возрастом 16 и полом мужского пола.

public class MyAttribute : Attribute
{

    public MyAttribute(int age)
    {
        Age = age;
    }

    public MyAttribute(int age, string gender)
    {
        Age = age;
        Gender = gender;
    }

    public int Age { get; set; }

    public string Gender { get; set; }

}

public class AnotherAttribute : Attribute
{

    public AnotherAttribute(string name)
    {
        Name = name;
    }

    public string Name { get; set; }

}

[My(12, "Male")]
[Another("Bob")]
public class BaseClass
{
}

[My(16)]
public class DerivedClass : BaseClass
{
}

Ответы [ 2 ]

2 голосов
/ 07 февраля 2010

Вы можете иметь несколько экземпляров одного и того же атрибута на объекте (это опция для AttributeUsageAttribute, применяемая к вашему атрибуту). Когда вы получаете атрибуты для типа, вы можете получить все атрибуты, примененные к цепочке наследования.

Однако в стандартных инструментах нет ничего, что могло бы взять два экземпляра атрибута и создать один.

(Теоретически, постпроцессор, который переписал MSIL, мог бы сделать это.)

0 голосов
/ 07 февраля 2010

Во-первых, я не верю, что любое поведение, о котором вы спрашиваете, будет зависеть от атрибута AttributeUsage, который должен украшать ваши классы атрибутов (, похоже, я могу ошибаться ). Я также не вижу, где какой-либо атрибут будет объединен. Каждый атрибут является представлением класса сам по себе. Каждый класс атрибута должен возвращать свои собственные данные. Я ожидаю, что DerivedClass.GetCustomAttributes() вернет три отдельные ссылки для каждого атрибута - 2 из базового класса и 1 для себя.

Попробуйте установить AttributeUsage в 'MyAttribute', чтобы разрешить несколько. Возможно, они не объединяются, а получают «последнюю» версию атрибута.

Я просто подумал о чем-то еще, что могло вызвать таинственный исчезающий акт. Возможно, вам придется пойти после класса base, чтобы получить атрибут original ? Вы можете попробовать это:

base.GetType().GetCustomAttributes();

Я немного покопался, и вот что сделает AttibuteUsage и может заставить вас увидеть только один из MyAttribute классов:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]

Я был близок в своем заявлении ранее об использовании AttributeUsage; однако это именованный параметр Inherited, который ограничит видимость для декорации базового класса 'MyAttribute. Попробуйте указать Inherited = true и посмотрите, что вы получите.

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