Использование атрибута DefaultValueAttribute в классе, который используется в качестве типа в MetadataTypeAttribute

Я использовал атрибут 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; }
}

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


person Peter T. LaComb Jr.    schedule 19.01.2011    source источник
comment
Пожалуйста, предоставьте минимально жизнеспособный пример исходного кода, который демонстрирует проблему.   -  person Ondrej Tucny    schedule 20.01.2011
comment
Да, я не думал, что кто-то получит это без какого-либо источника.   -  person Peter T. LaComb Jr.    schedule 20.01.2011


Ответы (1)


Добавьте конструктор в класс 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

person Kyle Trauberman    schedule 27.01.2011