C # Атрибуты обязательного свойства - PullRequest
4 голосов
/ 31 августа 2010

Я создал атрибут как

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
    [Serializable]
    public class TestPropertyAttribute : System.Attribute
    {
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }string _name;
    }

и я должен отметить «Имя» как обязательное свойство этого атрибута. Как это сделать?

Ответы [ 2 ]

11 голосов
/ 31 августа 2010

Поместите его в конструктор, а не просто как отдельное свойство:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
[Serializable]
public class TestPropertyAttribute : System.Attribute
{
    readonly string _name;

    public TestPropertyAttribute(string name)
    {
        _name = name;
    }

    public string Name { get { return _name; } }
}

Я не верю, что вы можете сделать это обязательным и использовать синтаксис Name=... при применениихотя атрибут.

0 голосов
/ 08 мая 2012

Вы должны использовать атрибут System.ComponentModel.Data.Annotations.StringLength (dot.NET 4), чтобы задать минимальную длину строки и проверить ее в своих данных. Кроме того, (и люди будут насмехаться над этим, потому что обычно это плохой дизайн *), я бы выбрасывал IntoridDataException («Вы должны ввести имя в атрибуте») из ctor, когда Имя не заполнено.

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

Я искал способы прямой связи с предупреждениями / ошибками в ErrorList, но до сих пор я не нашел простого способа сделать это, кроме создания собственного пользовательского дизайнера или надстройки. Я много думал о создании надстройки, которая будет искать SendWarning, SendError, настраиваемые атрибуты, но пока не осуществит это.

как я сказал

 public sealed class TestPropertyAttribute : System.Attribute
{
    [System.ComponentModel.DataAnnotations.StringLength(50),Required]
    public string Name
    {
        get { return _name; }
        set
  { 
         if (String.IsNullOrEmpty(value)) throw new InvalidDataException("Name is a madatory property,  please fill it out not as null or string.Empty thanks"); }
       else
      _name= value;


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