回答:
スティックAttributeUsage(一口だうん、)あなたのAttributeクラスに属性をセットAllowMultipleしますtrue:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class MyCustomAttribute: Attribute
つまり、カスタムattrbiuteがTypeIdをオーバーライドしない限り、それを介してアクセスするとPropertyDescriptor.GetCustomAttributes()、属性の単一のインスタンスのみが返されます。
デフォルトでは、Attributesは単一のフィールド/プロパティなどに1回だけ適用されるように制限されています。これは、MSDN のAttributeクラスの定義から確認できます。
[AttributeUsageAttribute(..., AllowMultiple = false)]
public abstract class Attribute : _Attribute
したがって、他の人が指摘したように、すべてのサブクラスは同じ方法で制限され、同じ属性の複数のインスタンスが必要な場合は、明示的AllowMultipleにtrue次のように設定する必要があります。
[AttributeUsage(..., AllowMultiple = true)]
public class MyCustomAttribute : Attribute
複数の使用を許可する属性では、TypeIdプロパティをオーバーライドして、などのプロパティがPropertyDescriptor.Attributes 期待どおりに機能することを確認する必要もあります。これを行う最も簡単な方法は、そのプロパティを実装して属性インスタンス自体を返すことです。
[AttributeUsage(..., AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{
public override object TypeId
{
get
{
return this;
}
}
}
(この回答を投稿するのは、他の回答が間違っているからではなく、より包括的/標準的な回答だからです。)
別の方法として、シーケンスを使用できるように属性を再設計することを検討してください。
[MyCustomAttribute(Sequence="CONTROL,ALT,SHIFT,D")]
または
[MyCustomAttribute("CONTROL-ALT-SHIFT-D")]
次に、値を解析して属性を構成します。
この例については、www.codeplex.com / aspnetでASP.NET MVCソースコードのAuthorizeAttributeを確認してください。
MyCustomAttributeコンストラクタに文字列の配列 aを使用させることもできます。次に、構文を使用して(を使用して)適用できます。string[]params[MyCustom("CONTROL", "ALT", "SHIFT", "D")]params