Подтвердить что ты не робот

Могу ли я использовать атрибуты с анонимными классами?

У меня есть анонимный класс:

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
};
4b9b3361

Ответ 1

На самом деле вы создаете то, что называется анонимным типом, а не динамическое.

К сожалению, нет способа добиться того, что вы пытаетесь сделать. Анонимные типы должны быть очень простым неизменяемым типом, состоящим из пар имя/значение.

Версия анонимного типа С# позволяет вам настраивать набор пар имя/значение в базовом типе. Ничего больше. VB.Net позволяет немного больше настроек в том, что пары могут быть изменяемыми или неизменяемыми. Тем не менее, вы не можете увеличивать тип с атрибутами.

Если вы хотите добавить атрибуты, вам нужно создать полный тип.

РЕДАКТИРОВАТЬ OP спросил, можно ли добавить атрибуты через отражение.

Нет, этого не может быть сделано. Отражение - это способ проверки метаданных, не изменяющих его. Следовательно, он не может использоваться для добавления атрибутов.

Кроме того, определения типов в сборке и, вообще говоря, являются неизменяемыми и не могут быть изменены во время выполнения [1]. Это включает добавление атрибутов в метод. Таким образом, нельзя использовать и другие отражения, подобные технологиям.

[1] Единственное исключение - операция ENC

Ответ 2

Прежде всего, это анонимный тип. Слово "динамический" может заставить людей думать, что вы говорите о классе С# 4.0, реализующем динамическую семантику, которой вы не являетесь.

Во-вторых, нет, вы не можете делать то, что вы просите.

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

Ответ 3

Можно добавить атрибуты в анонимный экземпляр, используя TypeDescriptor.AddAttributes. Затем вы можете получить доступ к атрибутам с помощью TypeDescriptor.GetAttributes.

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