AllowMultiple does not work with Property Attributes?

孤人 提交于 2019-12-09 16:51:29

问题


I'm tying to collect all Custom Attributes placed over a Property. There are more than one Attributes of the same type assigned to the Property, but when collecting them , the resulting collection only contains the first Attribute of the specific type:

The Attribute class

[AttributeUsage(System.AttributeTargets.Property,
               AllowMultiple = true)]

public class ConditionAttribute : Attribute{...}

Usage:

[ConditionAttribute("Test1")]
[ConditionAttribute("Test2")]
[ConditionAttribute("Test3")]
public Color BackColor{get; set;}

Now when looping through all Props of the object 'value' whose class contains the Prop "BackColor":

foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value))
{
  foreach (Attribute attribute in property.Attributes)
  {   ... }
   ....
}

the collection property.Attributes only contains ONE Attribute of type "ConditionAttribute" : The one with "Test1". The others are ignored;-(

So does AllowMultiple not work for Property Attributes ?

Thanks in advance

henrik


回答1:


According to a post on MSDN, this is by design as part of the PropertyDescriptor class.

However, you can actually solve the problem by overriding TypeId in your custom attribute (Thanks to Ivan from Mindscape for pointing this out):

public override object TypeId
{
  get
  {
    return this;
  }
}



回答2:


Yes, it does work. Not sure why it does not work via PropertyDescriptors.

You can always do: Attribute.GetCustomAttributes(methodInfo, typeof(ConditionAttribute))




回答3:


Another way to tweak this,

[ConditionAttribute("Test1,Test2,Test3")] public Color BackColor{get; set;}

and in your validation code,

Dim lstProperties() As String = _ChkColors.Split(",") For each strProp as string in lstPropertyes ' your validation ' return Next



来源:https://stackoverflow.com/questions/848669/allowmultiple-does-not-work-with-property-attributes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!