С моей точки зрения, есть много вариантов.
Один из них будет с генерацией кода.Вы можете использовать механизм T4 для чтения некоторого файла конфигурации и применения некоторых атрибутов к произвольному члену.
Узнайте больше о T4 на http://msdn.microsoft.com/en-us/library/ff697195.aspx
Иногда некоторые классыявляется частью некоторой иерархии, и вы можете использовать некоторый атрибут в абстрактном или виртуальном элементе, поэтому для производных классов, переопределяющих эти атрибуты, этот атрибут не понадобится, поскольку он уже объявлен в базовом элементе.
О читабельности можно использоватьрегионы, чтобы скрыть атрибуты членов.
В любом случае, я предложу вам подход к генерации кода, потому что это самое чистое и простое решение.Да, это не альтернатива, потому что у вас будет точный код, но вы не будете делать это вручную.
Наконец, большинство .NET API и сторонних API позволяет вам настраиватьвещи с атрибутами или с некоторой объектной моделью, поэтому, может быть, когда вы обнаружите, что ваш код полон атрибутов, некоторые вещи могут быть сделаны путем создания собственной схемы конфигурации и использования объектной модели библиотеки для настройки вашей среды.
РЕДАКТИРОВАТЬ
Я хочу добавить, что если вам нравится подход генерации кода, вы можете использовать пользовательские атрибуты, которые будут заменены правильными, когда какой-либо шаблон кода выполняется над некоторымифайл.
Примером этого может быть:
[SomeFake]
public void A() {}
... and after code generation
[SomeActual(Allow = true, Loggable = true)]
public void A() {}