Декларация принудительного атрибута в производных классах - PullRequest
8 голосов
/ 19 января 2012

Я недавно читал об атрибутах и ​​рефлексии, и я подумал, что было бы неплохо включить метаданные в мою программу.У меня есть этот абстрактный класс, и я хотел, чтобы все классы, унаследованные от него, объявляли с атрибутом некоторый класс, поскольку я хотел, чтобы для моей программы были созданы пользовательские компоненты (эти производные классы), и хотел прочитать метаданные этих классов во время выполнения.Однако все производные классы должны явно объявить атрибут, в котором я храню метаданные.Так как же заставить объявление атрибута в производных классах?Спасибо.

Ответы [ 4 ]

4 голосов
/ 19 января 2012

Определите свой класс атрибута, чтобы он имел атрибут AttributeUsageAttribute, где свойство Inherited равно true.

Или нет, так как это значение по умолчанию ...

Производные цели (то есть классы, если атрибут находится в классе, методы, если он находится в методе и т. Д.) Будут наследовать атрибут без явного объявления.

2 голосов
/ 19 января 2012

Если под «силой» вы подразумеваете «принудительное выполнение времени компиляции»: вы не можете.

1 голос
/ 19 января 2012

Как говорит Даниил, вы не можете форсировать во время компиляции. Вы можете добавить атрибут (ы) к абстрактному родителю и забрать их.

Другой вариант - добавить метод для проверки наличия атрибута в родительском классе и вызвать исключение, если оно отсутствует. Назовите это из подходящих методов.

1 голос
/ 19 января 2012

Как сказал Дэниел, вы не можете применять атрибуты во время компиляции.

Но если вы хотите читать данные во время выполнения, зачем вообще беспокоиться об атрибутах и ​​отражении?Вы можете создать абстрактный метод в своем абстрактном классе:

abstract class Base
{
    public abstract string Metadata();
}

class Derived1 : Base
{
    public override string Metadata()
    {
        return "Metadata for Derived1";
    }
}

class Derived2 : Base  // won't compile, since Metadata has not been provided
{
}

Конечно, поведение немного иное.При использовании этой опции вам нужна ссылка на экземпляр производного класса, а не только на информацию о типе.С другой стороны, он избегает отражения.

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