Использование атрибута Force в подклассе абстрактного суперкласса

Как заставить подкласс реализовать определенные атрибуты своего суперкласса? Причина в том, что я хочу использовать атрибуты для общей информации о классе, например. "DisplayName", "Описание" или "Возможности".

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

Есть ли что-то вроде атрибута abstract, как для методов?

[abstract DeclareMe]
public abstract class InheritMe {
    public abstract void DeclareMe();
}

Ответ 1

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

Вот пример кода для вас.

class Program
{
    static void Main(string[] args)
    {
        var a = new SubA();
        var b = new SubB();
    }
}

class BaseClass
{
    public BaseClass()
    {
        Type t = GetType();
        if (t.IsDefined(typeof(SerializableAttribute), false) == false)
        {
            Console.WriteLine("bad implementation");
            throw new InvalidOperationException();
        }
        Console.WriteLine("good implementation");
    }
}

[Serializable]
class SubA : BaseClass
{ }

class SubB : BaseClass
{ }

Последнее слово, не будьте слишком осторожны с самим собой. Когда я делал свой проект, я всегда думал, что могу назвать два метода в неправильном порядке или забыть что-то сделать, затем я превратил простой дизайн в сложный, чтобы предотвратить возможные ошибки. Позже я выбросил охранников, просто выбросив Исключения и код, используемый для обнаружения неожиданных ситуаций, был окружен #if DEBUG.

Ответ 2

В дополнение к ответам из этого другого потока:

Вы можете использовать FxCop и реализовать настраиваемое правило, которое проверяет наличие ваших атрибутов.