【问题标题】:AllowMultiple does not work with Property Attributes?AllowMultiple 不适用于属性属性?
【发布时间】:2010-10-25 07:43:40
【问题描述】:

我想收集放置在属性上的所有自定义属性。有多个相同类型的Attributes分配给了Property,但是在收集它们时,得到的集合只包含特定类型的第一个Attribute:

属性类

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

public class ConditionAttribute : Attribute{...}

用法:

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

现在循环遍历对象“value”的所有道具时,其类包含道具“BackColor”:

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

集合 property.Attributes 仅包含一个“ConditionAttribute”类型的属性:具有“Test1”的那个。其他的被忽略;-(

那么 AllowMultiple 对 Property Attributes 不起作用吗?

提前致谢

亨里克

【问题讨论】:

    标签: attributes custom-attributes


    【解决方案1】:

    根据a post on MSDN,这是设计为 PropertyDescriptor 类的一部分。

    但是,您实际上可以通过在自定义属性中覆盖 TypeId 来解决问题(感谢 Ivan from Mindscape 指出这一点):

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

    【讨论】:

    • 我在 MVC 中使用自定义 ValidationAttribute 时遇到了类似的问题;这解决了我的问题。
    【解决方案2】:

    是的,它确实有效。不知道为什么它不能通过 PropertyDescriptors 工作。

    你总是可以这样做:Attribute.GetCustomAttributes(methodInfo, typeof(ConditionAttribute))

    【讨论】:

      【解决方案3】:

      另一种调整方式,

      [ConditionAttribute("Test1,Test2,Test3")] 公共颜色背景色{get;设置;}

      在您的验证代码中,

      Dim lstProperties() As String = _ChkColors.Split(",") 对于 lstPropertyes 中的每个 strProp 作为字符串 '你的验证 ' 返回 下一个

      【讨论】:

        猜你喜欢
        • 2018-03-06
        • 2020-08-15
        • 2017-10-12
        • 2010-12-31
        • 2014-01-11
        • 2017-10-30
        • 2021-06-11
        • 2014-10-06
        • 1970-01-01
        相关资源
        最近更新 更多