Можно ли динамически добавлять атрибуты в C#?

можно ли добавлять атрибуты во время выполнения или изменить значение атрибута во время выполнения?

10 ответов


атрибуты статические метаданные. Сборки, модули, типы, члены, параметры и возвращаемые значения не являются первоклассными объектами в C# (например,System.Type class-это просто отраженное представление типа). Вы можете получить экземпляр атрибута для типа и изменить свойства, если они доступны для записи, но это не повлияет на атрибут при его применении к типу.


Это действительно зависит от того, что именно вы пытаетесь достичь.

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

насколько я знаю, Элемент управления PropertyGrid и поверхность разработки visual studio-это единственные вещи в BCL, которые потребляют материал TypeDescriptor. Фактически, именно так они делают половину того, что им действительно нужно делать.


ну, просто чтобы быть другим, я нашел статью, которая ссылается на отражение.Выделяют для этого.

вот ссылка:http://www.codeproject.com/KB/cs/dotnetattributes.aspx, вы также захотите ознакомиться с некоторыми комментариями в нижней части статьи, потому что обсуждаются возможные подходы.


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


нет, это не так.

атрибуты являются метаданными и хранятся в двоичной форме в скомпилированной сборке (поэтому в них можно использовать только простые типы).


Я так не думаю. Даже если я ошибаюсь, лучшее, на что вы можете надеяться, - это добавить их ко всему типу, никогда не экземпляр типа.


Если вам нужно что-то, чтобы иметь возможность динамически добавлять атрибуты в C# не так. Посмотрите на хранение данных в xml. Недавно я сделал проект, который я начал W / attributes, но в конечном итоге перешел к сериализации w/ xml.


зачем вам это нужно? Атрибуты дают дополнительную информацию для отражения, но если вы извне знаете, какие свойства вы хотите, они вам не нужны.

вы можете хранить метаданные извне относительно легко в базе данных или файле ресурсов.


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

в части счетчика я хотел изменить некоторые значения атрибутов. Я сделал 2 функции, которые отлично работают для этой цели.

        // ************************************************************************
        public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName,  string description)
        {
            PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
            var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
            if (att != null)
            {
                var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance);
                if (fieldDescription != null)
                {
                    fieldDescription.SetValue(att, description);
                }
            }
        }

        // ************************************************************************
        public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly)
        {
            PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
            var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
            if (att != null)
            {
                var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
                if (fieldDescription != null)
                {
                    fieldDescription.SetValue(att, isReadOnly);
                }
            }
        }

в Java я работал вокруг этого, используя карту и реализуя свой собственный подход к кодированию ключевых значений.

http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html