当前位置:  开发笔记 > 编程语言 > 正文

如何创建重复的允许属性

如何解决《如何创建重复的允许属性》经验,为你挑选了4个好方法。

我正在使用从属性类继承的自定义属性.我这样使用它:

    [MyCustomAttribute("CONTROL")]
    [MyCustomAttribute("ALT")]
    [MyCustomAttribute("SHIFT")]
    [MyCustomAttribute("D")]
    public void setColor()
{

}

但是显示了"Duplicate'MyCustomAttribute'属性"错误.
如何创建重复的允许属性?



1> Anton Gogole..:

AttributeUsage属性粘贴到您的Attribute类(是的,那是满口)并设置AllowMultipletrue:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class MyCustomAttribute: Attribute


Microsoft建议尽可能密封属性类:http://msdn.microsoft.com/en-us/library/2ab31zeh.aspx
只是好奇 - 为什么要"密封"课?
密封为什么?简而言之:使属性查找更快,没有其他影响.

2> Marc Gravell..:

AttributeUsageAttribute ;-p

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyAttribute : Attribute
{}

但请注意,如果您使用的是ComponentModel(TypeDescriptor),则每个成员仅支持一个属性实例(每个属性类型); 原始反射支持任何数字......



3> mcdrewski..:

安东的解决方案是正确的,但还有另一个问题.

简而言之,除非您的自定义attrbiute覆盖TypeId,否则通过PropertyDescriptor.GetCustomAttributes()访问它只会返回属性的单个实例.



4> Ian Kemp..:

默认情况下,Attributes仅限于一次应用于单个字段/属性/等。您可以从MSDN 上的Attribute类定义中看到以下内容:

[AttributeUsageAttribute(..., AllowMultiple = false)]
public abstract class Attribute : _Attribute

因此,正如其他人指出的那样,所有子类都以相同的方式受到限制,并且如果您需要同一属性的多个实例,则需要显式设置AllowMultipletrue

[AttributeUsage(..., AllowMultiple = true)]
public class MyCustomAttribute : Attribute

在允许多种用途的属性上,您还应该覆盖TypeId属性以确保诸如PropertyDescriptor.Attributes 预期的属性能够正常工作。最简单的方法是实现该属性以返回属性实例本身:

[AttributeUsage(..., AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{
    public override object TypeId
    {
        get
        {
            return this;
        }
    }
}

(发布此答案不是因为其他答案是错误的,而是因为这是更全面/规范的答案。)

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有