Могу ли я использовать атрибуты с анонимными классами? - PullRequest
42 голосов
/ 02 августа 2009

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

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

Ответы [ 3 ]

50 голосов
/ 02 августа 2009

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

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

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

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

EDIT OP спросил, можно ли добавить атрибуты с помощью отражения.

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

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

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

9 голосов
/ 02 августа 2009

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

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

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

8 голосов
/ 16 октября 2012

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

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

...