5

鉴于以下情况,我不希望编译器允许从基本属性派生的多个属性,假设它设置为 AllowMultiple=false。事实上它编译没有问题 - 我在这里错过了什么?

using System;

[AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=true)]
abstract class BaseAttribute : Attribute { }

sealed class DerivedAttributeA : BaseAttribute { }

sealed class DerivedAttributeB : BaseAttribute { }

    class Sample1
    {
        [DerivedAttributeA()]
        [DerivedAttributeB()]
        public string PropertyA{ get; set; } // allowed, concrete classes differ

        [DerivedAttributeA()]
        [DerivedAttributeA()]
        public string PropertyB { get; set; } // not allowed, concrete classes the same, honours AllowMultiple=false on BaseAttribute
    }
4

1 回答 1

6

问题很简单,AllowMultiple检查只比较相同实际类型的属性(即实例化的具体类型) - 因此可能最好与sealed属性一起使用。

例如,它将强制执行以下内容(作为非法副本),继承自BaseAttribute

[DerivedAttributeB()]
[DerivedAttributeB()]
public string Name { get; set; }

简而言之,我不认为你可以在这里做你想做的事......(强制执行不超过一个实例,包括BaseAttribute每个属性的子类)。

这个问题的一个类似例子是:

[Description("abc")]
[I18NDescriptionAttribute("abc")]
public string Name { get; set; }

class I18NDescriptionAttribute : DescriptionAttribute {
    public I18NDescriptionAttribute(string resxKey) : base(resxKey) { } 
}

上面的目的是在运行时提供一个[Description]from resx(完全由ComponentModeletc 支持) - 但它不能阻止你也添加一个[Description].

于 2009-10-12T11:24:41.293 回答