Можно ли добавить атрибут к свойству в частичном классе?
Я не думаю, что это возможно, но так как у меня нет определенной ясности от MSDN, я чувствую, что лучше спросить. Предположим, что у нас есть класс следующим образом.
public partial class Hazaa
{
public int Shazoo { get; set; }
}
Затем я бы хотел, чтобы Shazoo был назван SuperCool, но я хочу сделать это в другом файле. Поскольку я использую частичные классы, я могу добавить новые свойства следующим образом.
public partial class Hazaa
{
[SuperCool]
public int Wheee { get; set; }
}
Но можно ли приписать свойство, объявленное в первом примере, написав код во втором? Я сомневаюсь, что это возможно, но я буду рада исправиться. Если так, какой синтаксис?
3 ответа
Нет, ты не можешь.
Вы можете прикрепить атрибуты только к тем элементам, которые вы объявили тут же и тогда, и если этот элемент также не объявлен как частичный (так что вы можете переопределить его в другом месте), вы не можете прикрепить атрибуты к элементам, объявленным в другом частичном файле.
Исходя из ваших требований, в качестве опции вы можете рассмотреть возможность использования:
MetadataType
атрибут
Атрибуты, которые вы можете зарегистрировать таким образом, на самом деле не являются вашими атрибутами класса, но большинство фреймворков используют их как ваши собственные атрибуты класса.
Если вы хотите добавить атрибуты аннотаций данных, особенно в качестве ASP.NET MVC
Проект, вы найдете этот способ полезным.
Также для других фреймворков, таких как Windows Forms
это не поддерживает MetadataTypeAttribute
Вы можете просто добавить поддержку, используя AssociatedMetadataTypeTypeDescriptionProvider
,
Решение не ограничивается атрибутами аннотаций данных, и вы можете использовать все виды атрибутов, которые имеют значение для ваших библиотек и сред.
Как определить дополнительные атрибуты?
Вы можете создать класс метаданных, который содержит свойства вашего исходного класса, украшенные подходящими атрибутами, а затем украсить частичный класс с помощью MetadataType
атрибут и введите класс метаданных для вашего исходного класса.
Как увидеть влияние этих атрибутов?
Рамки как ASP.NET MVC
используйте эти атрибуты так, как они определены в вашем исходном классе.
Также Вы можете зарегистрироваться AssociatedMetadataTypeTypeDescriptionProvider
в качестве поставщика для вашего исходного типа для других платформ или компонентов, которые могут захотеть использовать TypeDescriptor
чтобы получить информацию о вашем типе.
Они действительно мои атрибуты класса?
Пожалуйста, обратите внимание, таким образом, атрибуты действительно не принадлежат вашему исходному классу, но для большинства сред, таких как ASP.NET MVC
или же Windows Forms
это использование TypeDescriptor
чтобы получить информацию о типах, они действуют как исходные атрибуты вашего класса.
Поэтому, если вы хотите получить атрибуты для свойства с помощью отражения, вы не сможете их увидеть, но если вы используете TypeDescriptor
механизм, вы можете увидеть их.
Пример
Класс Хазаа:
public partial class Hazaa
{
public int Shazoo { get; set; }
}
HazaaMetadata Class
[MetadataType(typeof(HazaaMetadata))]
public partial class Hazaa
{
}
public class HazaaMetadata
{
[DisplayName("Shazoo Name")]
public int Shazoo { get; set; }
}
ASP.NET MVC Использование
вам не нужно ничего делать, чтобы сделать это DisplayName
работать, вы можете просто использовать Html.Labelfor
или же Html.DisplayNameForm
чтобы увидеть влияние. Он будет отображать "Имя Shazoo" как текст метки.
Использование Windows Forms
Где-то в вашем приложении (например, загрузка формы, main, ...) зарегистрируйте провайдера следующим образом:
var provider = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Hazaa));
TypeDescriptor.AddProvider(provider, typeof(Hazaa));
И в результате вы увидите PropertyGrid
а также DataGridView
используйте "Имя Shazoo" в качестве заголовка для свойства и заголовка столбца.
Конечно, вы можете сделать это с помощью метаданных следующим образом:
public partial class Hazaa : EntityBase
{
public int Shazoo { get; set; }
}
[MetadataTypeAttribute(typeof(HazaaMetadata))]
public partial class Hazaa : EntityBase
{
internal sealed class HazaaMetadata
{
[SuperCool]
public int Shazoo { get; set; }
}
}
Лучшее, что мы могли сделать, чтобы обеспечить сериализацию десятичных знаков до двух знаков после запятой, было tp:
- Используйте XlmAttributeOverides, чтобы игнорировать десятичное поле, т.е. не сериализовать его
var xmlAttributeOverrides = новый XmlAttributeOverrides(); var ctrlSumAttributes = новые атрибуты XmlAttributes { XmlIgnore = true }; xmlAttributeOverrides.Add(typeof(Sepa.GroupHeader39), "CtrlSum", ctrlSumAttributes); var ser = new XmlSerializer( typeof( Sepa.Document), xmlAttributeOverrides);
- Используйте частичный класс для добавления строковой сериализации игнорируемого поля
открытый частичный класс GroupHeader39 { [XmlElement("CtrlSum")] общедоступная строка CtrlSumString { get => CtrlSum.ToString("F2"); установить { /* требуется для работы */ } } }
Надеюсь, это поможет кому-то решить эту проблему.