2008-10-16 3 views
14

Я видел следующий код:C# свойство атрибутов

[DefaultValue(100)] 
[Description("Some descriptive field here")] 
public int MyProperty{...} 

Функциональность из приведенного выше Snippit кажется достаточно ясным, я понятия не имею о том, как я могу использовать его, чтобы сделать полезные вещи. Я даже не знаю, как это назвать!

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

ответ

13

Люди уже рассмотрели аспекты пользовательского интерфейса - атрибуты имеют другие применения, хотя ... например, они широко используются в большинстве схем сериализации. Некоторые атрибуты получают специальную обработку компилятором - например, [PrincipalPermission(...)] добавляет декларативную защиту методу, позволяя (автоматически) проверять, имеет ли пользователь подходящий доступ.

Чтобы добавить вашу собственную специальную обработку, вы можете использовать PostSharp; есть много отличных примеров использования PostSharp для создания AOP-вещей, таких как ведение журнала или просто упрощение кода, например, с помощью automatic INotifyPropertyChanged implementation.

6

Те, в вашем примере используется визуальный конструктор (т.е. MS Expression Blend и Visual Designer студия), чтобы дать подсказки в конструкторе UI.

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

Если вы по какой-либо причине хотите получить доступ к этим атрибутам, вам необходимо будет use reflection.

См. MSDN для получения дополнительной информации об атрибутах дизайнера.

+0

Они также используются в дизайнере Visual Studio. – 2008-10-16 14:08:18

+0

И важно отметить, что они просто подсказки: вам все равно нужно установить значение MyPoperty по умолчанию 100 в коде, например, или вы окажетесь лёгкому потребителю вашей собственности. – 2008-10-16 14:09:20

6

Они называются атрибутами, в msdn имеется много информации, например. http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

В общем, они ничего не делают «сами», они используются другим кодом, который будет использовать ваш класс. XmlSerialization - хороший пример: XmlSerializer (предоставленный Microsoft как часть фреймворка) может почти любой класс (есть ряд требований к классу, хотя) - он использует отражение, чтобы увидеть, какие данные содержатся в классе. Вы можете использовать атрибуты (определенные вместе с XmlSerializer), чтобы изменить способ, которым XmlSerializer будет сериализовать ваш класс (например, сообщите ему, чтобы сохранить данные как атрибут вместо элемента).

27

Функциональность из приведенного выше Snippit кажется достаточно ясным,

Может быть, не так, как многие люди думают, что [DefaultValue()] наборы от стоимости имущества. Фактически, все, что он делает, чтобы рассказать о каком-то визуальном дизайнере (например, Visual Studio), о том, какой код будет устанавливать значение по умолчанию. Таким образом он знает bold значение в окне свойств, если оно установлено на что-то еще.

3

Мы используем его для определения того, какой графический дизайнер должен быть загружен для настройки экземпляра определенного типа.

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

Например, рассмотрим следующий тип команды (так называемый композит в нашем решении)

[CompositeMetaData("Delay","Sets the delay between commands",1)] 
[CompositeDesigner(typeof(DelayCompositeDesigner))] 
public class DelayComposite : CompositeBase 
{ 
     // code here 
} 

Это используется информация, содержащаяся в двух местах

1) Когда дизайнер создает список команд, он использует CompositeMetaData для отображения дополнительной информации о команде.

2) Когда пользователь добавляет команду дизайнера и дизайнер создает экземпляр этого класса, он смотрит на имущество CompositeDesigner, создает новый экземпляр указанного типа (UserControl) и добавляет его к визуальный дизайнер.

Рассмотрим следующий код, который мы используем для загрузки команд в нашей панели инструментов «»:

Как вы можете видеть, для каждого типа в сборке которого имя заканчивается «Композит», мы получаем пользовательские атрибуты и используем эту информацию для заполнения нашего экземпляра ToolboxListItem.

Что касается загрузки дизайнера, атрибут retreived так:

var designerAttribute = (CompositeDesignerAttribute)item.CompositType.GetCustomAttributes(false) 
         .Where(a => a.GetType() == typeof(CompositeDesignerAttribute)).FirstOrDefault(); 

Это только один пример того, как вы могли бы быть в состоянии использовать пользовательские атрибуты,

Я надеюсь, что это дает вам место для начала.