Это зависит от контекста; для некоторых сценариев , атрибуты на самом деле могут быть добавлены во время выполнения - но они отображаются только под TypeDescriptor
(это то, что использует большинство привязок данных интерфейса пользователя), а не сырое отражение.
Например, для аннотирования типа :
TypeDescriptor.AddAttributes(typeof(Foo),
new TypeConverterAttribute(typeof(ExpandableObjectConverter)));
для замены преобразователя типов для типа во время выполнения .
Вы также можете сделать несколько трюков со свойствами , но это режим много ... с трудом.
для общего случая; просто используйте атрибуты кода. В атрибутах нет ничего неразборчивого, и их расположение подчеркивает, что они являются метаданными - о типе / методе, но на самом деле не являются частью самого типа / метода.
Следующее только для обсуждения; Я бы не стал этого делать только потому, что вам не нравится его внешний вид (хотя я сделал что-то подобное, чтобы помочь комментировать машинно-сгенерированный код):
файл 1
[Description("evil evil evil")]
partial class Foo {
[Description("don't do this")]
partial void Bar();
}
файл 2
partial class Foo {
partial void Bar() {
Console.WriteLine("I can only be called from inside the type; "
+ "I can't be public");
}
}