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

У меня есть автоматически созданный класс для импорта веб-службы, содержащей что-то вроде этого (сокращенно):

[System.Runtime.Serialization.DataMemberAttribute()]
public System.DateTime StartDate 
{
    get 
    {
        return this.StartDateField;
    }
    set { /* implementation prop changed */ }
}

И я хочу добавить к этому члену атрибут формата MVC. Итак, в другом файле, содержащем то же определение partial class, я хотел бы сделать что-то вроде следующего (что незаконно):

[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)] 
public DateTime StartDate;

Частичный метод здесь бесполезен, потому что частичные методы должны быть частными, иметь тип возврата void, должны быть методом и т. Д.

Как я могу украсить этого члена?


person Abel    schedule 16.04.2012    source источник
comment
Предполагается, что второй фрагмент кода определяет StartDateField, используемый свойством StartDate в вашем первом фрагменте?   -  person M.Babcock    schedule 16.04.2012
comment
Вместо использования частичных классов для украшения вашего сгенерированного кода вы должны использовать атрибут MetadataType с другим классом, который отражает сгенерированный класс. (Связанный вопрос)   -  person M.Babcock    schedule 16.04.2012
comment
@ M.Babcock: нет, второй фрагмент находится в частичном классе с тем же именем, что и первый. Обычно таким образом добавляют расширения к автоматически сгенерированным классам, но обычно вы добавляете только свойства / методы, а не переопределяете их (черт возьми, вы не можете).   -  person Abel    schedule 16.04.2012
comment
Правильный. Это то, к чему обращается мой второй комментарий.   -  person M.Babcock    schedule 16.04.2012
comment
проверьте это, я уже ответил на этот вопрос здесь stackoverflow.com/a/24757520/3050647   -  person elia07    schedule 15.07.2014
comment
@ elia07: на самом деле не принято ссылаться на свои ответы где-либо еще, это легко может быть неправильно истолковано как попытка повысить ваш балл, если только это действительно не добавляет что-то в обсуждение. В этом случае ваш ответ не связан с частичными классами и не решает проблему, упомянутую здесь, по крайней мере, я не понимаю, как это происходит (мой вопрос касался расширения свойства частичного класса).   -  person Abel    schedule 15.07.2014


Ответы (1)


Вы можете использовать атрибут MetadataType следующим образом:

[MetadataType(typeof(MyClass_Validation))]     
public partial class MyClass
{} 

public class MyClass_Validation     
{     
   [DisplayFormat(...)] 
   public DateTime StartDate { get; set; } 
}
person ionden    schedule 16.04.2012
comment
Вы хотите сказать, что использование MetadataType здесь заставляет компилятор добавлять атрибуты похожих подписей к соответствующим подписям в частичном классе? Звучит потрясающе, если это сработает. - person Abel; 16.04.2012
comment
Да, используйте атрибут MetadataType, чтобы определить тип, который будет содержать атрибуты, например, для автоматически сгенерированного класса. Также рекомендуется указывать атрибуты проверки в другом классе. - person ionden; 16.04.2012
comment
@Abel - Да, это было специально разработано для этого случая. И совпадение указано по имени, а не по подписи. - person Henk Holterman; 16.04.2012
comment
Работает как шарм. Спасибо за обновление @Henk, буду осторожнее с перегрузками. Однако в TCPL ничего этого найти не удалось, хотя там указаны некоторые специальные атрибуты. - person Abel; 16.04.2012