2016-07-14 6 views
0

Я видел термин «класс друзей», используемый как «ответ» на такие вопросы, как «как добавить аннотации к частичным классам в другом файле», но эти ответы предполагают, что я знаю, что класс друзей равен, и примеры кода предполагают, что я понимаю, как это работает.Что такое класс Buddy и как его использовать для добавления аннотаций в существующий класс?

Я не видел простого объяснения того, что такое класс друзей в C#, и как/почему он позволяет мне изменять существующий класс, например добавлять аннотации к свойствам.

+0

Какая часть «предполагает, я знаю, что _is_ класс приятель» было неясно? –

+0

Этот вопрос не объясняет, что происходит, он просто спрашивает, почему люди так делают. –

+0

Вы не можете определить одно и то же свойство дважды в двух частичных классах ... http://stackoverflow.com/questions/6131754/how-to-add-data-annotations-to-partial-class –

ответ

4

«Бадди-класс» не обязательно является C#, но я считаю, что он чаще встречается в .Net как своего рода шаблон или метод (хак), используемый для расширения автоматически сгенерированных классов и добавления к ним атрибутов. Они иногда называются ассоциированными классами или классами метаданных. Соглашение об именах заключается в том, чтобы добавить MD (для метаданных) к классу друзей, чтобы его можно было идентифицировать как единое целое. Что касается того, почему, сгенерированный автоматически сгенерированный код перезапишет любые сделанные вами изменения. Связанные классы могут быть способом обойти это, и вы можете сохранить свои собственные метаданные (например, атрибуты проверки). У вас есть один класс, который автоматически генерируется, удобно обозначается как частичный (я считаю, что на самом деле почему был добавлен частичный модификатор - для расширения автоматически сгенерированных классов). Вы хотите применить атрибут, чтобы создать отдельный класс, который содержит это, и вы подружитесь с другим классом.

Если VS генерирует это для одного из ваших entitites:

public partial class AutoGeneratedClass 
{ 
    public string SomeData { get; set; } 
} 

И вы хотите, чтобы расширить это и добавить пользовательские мета-данные, которые вы могли бы создать это:

[MetadataType(typeof(NotAutoGeneratedClassMD))] 
public partial class AutoGeneratedClass 
{ 
} 

public class NotAutoGeneratedClassMD 
{ 
    [DisplayName("This is some data")] 
    public string SomeData { get; set; } 
} 

Укороченный вариант:

Что: способ связать классы для расширения автоматически сгенерированного класса с пользовательскими метаданными

Зачем: Избегайте, чтобы ваши изменения в автоматически сгенерированный класс были перезаписаны при генерации снова.

Лично я не фанат, но это совсем другая история :)

+0

Спасибо, это немного разъясняет, хотя существование '[MetadataType]' немного странно. Кроме того, вы _can_ определяете одно и то же свойство дважды таким образом, но не используете два частичных класса с одним и тем же именем (что, казалось бы, является «правильным») –

+0

Нет проблем. Обязательно отметьте ответ, чтобы другие могли найти вопрос и ответ, а также :) –