我创建了像
这样的属性 [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
[Serializable]
public class TestPropertyAttribute : System.Attribute
{
public string Name
{
get { return _name; }
set { _name = value; }
}string _name;
}
我应该将“Name”标记为此属性的强制属性。怎么做?
答案 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; }
}