C#属性必需属性

时间:2010-08-31 07:54:37

标签: c# .net attributes

我创建了像

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

我应该将“Name”标记为此属性的强制属性。怎么做?

3 个答案:

答案 0 :(得分:11)

将它放在构造函数中,而不是作为单独的属性:

[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=...语法。

答案 1 :(得分:0)

您应该使用System.ComponentModel.Data.Annotations.StringLength(dot.NET 4)属性来强制字符串的最小长度,并在您的数据中进行验证。此外,(并且人们会因为它通常是糟糕的设计而嘲笑我)当我没有填充名称时,我会从ctor抛出一个InvalidDataException(“你必须在属性中输入一个名字”)。

我之所以会使用这个是因为这是一个设计时属性,并且该异常将在应用程序启动时运行,因此为开发人员修复会更容易,这不是最佳选择,但我不是知道如何与设计师沟通。

我一直在寻找与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;
 }

答案 2 :(得分:0)

Jon Skeet接受的答案是一个很好的解决方案。但是,如今您可以使用较短的代码来编写它。原理相同:

public class TestPropertyAttribute : Attribute
{
    public TestPropertyAttribute(string name)
    {
        Name = name;
    }

    public string Name { get; }
}