Пользовательский атрибут в C #: как создать атрибут, который определяет несколько других атрибутов? - PullRequest
3 голосов
/ 29 июля 2010

В моем поле «Имя» определены следующие атрибуты:

[Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(MyResources))]
[Display(Order = 0, Name = ResXStrings.UserName, ResourceType = typeof(MyResources))]
public string Name { get; set; }

Я хочу создать собственный атрибут, который выглядит следующим образом:

[MyAttribute(DisplayName = "Username", ErrorMessage = "ValidationErrorRequiredField", ResourceType = typeof(MyResources))]
public string Name { get; set; }

, который определяет в коде два других ( обязательных и отображения ) атрибута.

Как это реализовать?

UPDATE Это невозможно. Спасибо всем, кто помог мне ответить на мой вопрос.

Ответы [ 4 ]

2 голосов
/ 29 июля 2010

Не думаю, что ты можешь.Поскольку потребители атрибутов часто находят их по типу, ваш новый атрибут должен быть и для RequiredAttribute и DisplayAttribute.C # не поддерживает множественное наследование, поэтому нет способа создать такой класс.

2 голосов
/ 29 июля 2010

Я уверен, что вы не сможете этого сделать.Проблема в том, что атрибут - это просто часть метаданных, привязанных к типу, методу, свойству и т. Д. Он сам по себе не делает ничего.

Это докод, который использует метаданные, чтобы решить, что с ним делать и как действовать.

Даже если атрибут содержит некоторый функциональный код (например, System.Web.Mvc.ActionFilterAttribute ), он потребляет атрибут, который его вызывает.

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

1 голос
/ 29 июля 2010

Теперь есть способ сделать это с помощью пользовательских атрибутов. Вы можете попробовать реализовать ICustomTypeDescriptor и добавить любые атрибуты, какие захотите, но я сомневаюсь, что это поддерживается в каждом сценарии.

0 голосов
/ 29 июля 2010

Это невозможно напрямую , но вы могли бы сделать это с некоторыми изменениями в дизайне вашего приложения, но я бы не рекомендовал делать это потому что, если вы это сделаете, вы нарушаете SRP , помещая две разные обязанности в один класс.

Помните, у класса всегда должна быть одна причина для изменения.

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