Использование DefaultValueAttribute в классе, который используется в качестве типа в MetadataTypeAttribute - PullRequest
5 голосов
/ 20 января 2011

Я использовал атрибут MetadataType для добавления атрибутов проверки в классы, которые я генерирую с использованием шаблона T4. Это прекрасно работает, но я хотел бы иметь возможность использовать атрибут DefaultValue в некоторых свойствах, чтобы мой класс MetadataType более полно описывал мои классы (и чтобы мне не пришлось реализовывать метод OnCreated в этих классах) , Я могу добавить атрибут в мой класс MetadataType, но он не имеет никакого эффекта.

Вот пример источника - сгенерированная часть (конечно) находится в другом файле. Если я создаю экземпляр объекта Widget, свойство Name будет иметь значение null.

/// <summary>
/// This part is generated
/// </summary>
public partial class Widget
{
    public string Name { get; set; }
}

/// <summary>
/// This part is hand-coded so I can add attributes, custom methods etc.
/// </summary>
[System.ComponentModel.DataAnnotations.MetadataType(typeof(WidgetMetadata))]
public partial class Widget
{
}

/// <summary>
/// This part is hand-coded, and any validation attributes I add work fine.
/// </summary>
public class WidgetMetadata
{
        [System.ComponentModel.DefaultValue("Default Name")]
        [StringLengthValidator(0, RangeBoundaryType.Inclusive, 320, RangeBoundaryType.Inclusive, Tag = "Invalid string length", MessageTemplate = "{1} must contain between \'{3}\' to \'{5}\' characters.")]
        public string Name { get; set; }
}

Что я делаю не так? Или это не поддерживается (и если да, то где-нибудь документировано?)

1 Ответ

3 голосов
/ 27 января 2011

Добавьте конструктор к классу WidgetMetaData и установите там значение по умолчанию для свойства.DefaultValueAttribute используется для Visual Studio Toolbox (я полагаю), чтобы определить, должно ли значение быть выделено жирным шрифтом (изменено) или нет (значение по умолчанию), среди прочего.Вам все еще нужно установить значение свойства в какой-то момент.

public WidgetMetaData() 
{
    Name = "Default Value";
}

Дополнительная информация о DefaultValueAttribute: http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute(v=vs.71).aspx

...