【问题标题】:Get other property attributes while validating a custom attribute在验证自定义属性时获取其他属性属性
【发布时间】:2015-04-27 09:58:55
【问题描述】:

我创建了一个验证属性。而IsValid方法如下

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]
public sealed class BlaBlaAttribute : ValidationAttribute
{

    private readonly object _typeId = new object();
    //...........

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {

        var otherProperties = validationContext.ObjectType.GetProperties(BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance).ToList();

        foreach (void propItem in otherProperties) {  
            // propItem.CustomAttributes.Count is zero for each and every property              
            DisplayAttribute attr = (DisplayAttribute)Attribute.GetCustomAttribute(propItem, typeof(DisplayAttribute));
            if (attr == null) {
                //............
            }
        }
        return ValidationResult.Success;
    }
}

并且属性使用如下

[MetadataType(typeof(SiteContact.SiteContactMD))]
public class SiteContact
{
    public class SiteContactMD
    {
        [BlaBla()]
        [Display(Name = "First Name")]
        public override string christian { get; set; }
        [Display(Name = "Last Name")]
        public virtual string surname { get; set; }

        [BlaBla()]
        [Display(Name = "Email Id")]
        public override string EMail { get; set; }
    }
}

有一些显示属性,但attr 始终为空。如何获取其他属性的自定义属性?

【问题讨论】:

    标签: .net validation reflection data-annotations custom-attributes


    【解决方案1】:

    找到this thread后,找到了获取显示属性的方法。

     protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
    
            var otherProperties = validationContext.ObjectType.GetProperties(BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance).ToList();
    
            //To get the assigned MetaDataAttribute for the class
            var metaData = validationContext.ObjectType.GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().ToArray().FirstOrDefault(); 
    
            foreach (void propItem in otherProperties) {  
    
                if (metaData != null) 
                {
                     // Get display attributes for the property
                     var attrs = metaData.MetadataClassType.GetProperty(propItem ).GetCustomAttributes(typeof(DisplayAttribute), true).OfType<DisplayAttribute>.ToArray();
                     if (attrs.Count > 0) 
                     {
                        this.OtherPropertyDisplayName = ((DisplayAttribute)attrs.FirstOrDefault()).Name;
                         //.............
                     }
                }
            }
            return ValidationResult.Success;
        }
    

    希望,它可以帮助某人。

    【讨论】:

      【解决方案2】:

      您已使用类DisplayAttribute 的实例装饰您的属性。

      [Display(Name = "First Name")]
      public override string christian { get; set; }
      

      然后你尝试获取DisplayNameAttribute类型的属性:

      GetCustomAttribute(propItem, typeof(DisplayNameAttribute))
      

      【讨论】:

      • 抱歉,打错字了。我已经修改了实际问题。但是,我无法获得其他属性的任何属性。 DisplayAttribute 就是一个例子。我错过了什么?
      猜你喜欢
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2017-12-28
      • 2013-01-17
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多