Могу ли я использовать атрибуты с анонимными классами?
У меня есть анонимный класс:
var someAnonymousClass = new
{
SomeInt = 25,
SomeString = "Hello anonymous Classes!",
SomeDate = DateTime.Now
};
В любом случае для присоединения атрибутов к этому классу? Отражение, другое? Я действительно надеялся на что-то вроде этого:
var someAnonymousClass = new
{
[MyAttribute()]
SomeInt = 25,
SomeString = "Hello anonymous Classes!",
SomeDate = DateTime.Now
};
Ответы
Ответ 1
На самом деле вы создаете то, что называется анонимным типом, а не динамическое.
К сожалению, нет способа добиться того, что вы пытаетесь сделать. Анонимные типы должны быть очень простым неизменяемым типом, состоящим из пар имя/значение.
Версия анонимного типа С# позволяет вам настраивать набор пар имя/значение в базовом типе. Ничего больше. VB.Net позволяет немного больше настроек в том, что пары могут быть изменяемыми или неизменяемыми. Тем не менее, вы не можете увеличивать тип с атрибутами.
Если вы хотите добавить атрибуты, вам нужно создать полный тип.
РЕДАКТИРОВАТЬ OP спросил, можно ли добавить атрибуты через отражение.
Нет, этого не может быть сделано. Отражение - это способ проверки метаданных, не изменяющих его. Следовательно, он не может использоваться для добавления атрибутов.
Кроме того, определения типов в сборке и, вообще говоря, являются неизменяемыми и не могут быть изменены во время выполнения [1]. Это включает добавление атрибутов в метод. Таким образом, нельзя использовать и другие отражения, подобные технологиям.
[1] Единственное исключение - операция ENC
Ответ 2
Прежде всего, это анонимный тип. Слово "динамический" может заставить людей думать, что вы говорите о классе С# 4.0, реализующем динамическую семантику, которой вы не являетесь.
Во-вторых, нет, вы не можете делать то, что вы просите.
Если вам нужно указать атрибуты для ваших свойств, вы вернетесь к именованному типу, т.е. нормальный класс или структура.
Ответ 3
Можно добавить атрибуты в анонимный экземпляр, используя TypeDescriptor.AddAttributes. Затем вы можете получить доступ к атрибутам с помощью TypeDescriptor.GetAttributes.
Это не добавит их в экземпляр Тип для объекта. Таким образом, это может быть не полезно в вашем случае, если вы не контролируете код, который извлекает и применяет атрибуты.