Я считаю, что нет никакого человеческого способа изменить какой-либо атрибут или поле внутри атрибута, кроме как сделать это в конструкторе. То есть, если не пересматривать и не перекомпилировать Visual Studio самостоятельно. Здесь уже есть похожий вопрос:
Изменить параметр атрибута во время выполнения
но я считаю, что особенности моей проблемы достаточно разные, чтобы требовать нового поста.
Я использую перечисление для отслеживания различных столбцов DataTable. Я использую атрибуты в каждом элементе перечисления, чтобы указать базовый тип и описание. В этом случае .ToString () даст «ужасный» результат из-за жесткого набора символов, которым разрешено именовать элемент перечисления, например, «Tomato_Field». "когда вы хотите" Томатное поле "и тому подобное. Это позволяет мне размещать всю связанную информацию в одном и том же объекте, что, как я считаю, должно быть. Таким образом я позже смогу создать все столбцы с простым и чистым foreach, который циклически перебирает элементы перечисления и извлекает метеданные (описание и тип) для создания каждого столбца.
Теперь некоторые столбцы автоматически рассчитываются, что означает, что при их создании -via DataTable Identifier.Columns.Add. (NameOfColumn, basicType, необязательный: autocalculatedString) - мне нужно указать строку, которая определяет способ ее вычисления , Эта строка должна использовать имена других столбцов, которые могут быть в Атрибуте Description. Подход, который выглядит логичным, заключается в использовании другого атрибута, который содержит строку, которая должна быть построена с использованием имен других столбцов, требующих доступа к метаданным. Теперь это кажется невозможным в конструкторе: вы вынуждены предоставить постоянную строку. Вы не можете использовать метод или что-нибудь.
Эту проблему можно решить, если во время выполнения есть способ изменить свойство внутри атрибута (назовем его AutocalculatedStringAttribute). Если у вас есть доступ к метаданным, вы можете получить строку, которую вы использовали в конструкторе Атрибута, и вы, конечно, можете изменить эту строку. Однако, если вы позже получите доступ к метаданным снова, это изменение игнорируется, я считаю, что конструктор вызывается каждый раз, когда к метаданным обращаются во время выполнения, таким образом игнорируя любые изменения.
Есть, конечно, грязные способы достичь того, что я пытаюсь сделать, но мой вопрос заключается в том, есть ли способ правильно использовать атрибуты для этого. Если не прибегать к CodeDOM для перекомпиляции всей сборки с измененным конструктором AutocalculatedStringAttribute, это определенное излишество.