Attribute.IsDefined doesn't see attributes applied with MetadataType class

后端 未结 4 625
旧巷少年郎
旧巷少年郎 2020-12-03 01:35

If I apply attributes to a partial class via the MetadataType attribute, those attributes are not found via Attribute.IsDefined(). Anyone know why, or what

4条回答
  •  我在风中等你
    2020-12-03 02:07

    The MetadataType attribute is used to specify help specify the additional information on the data object. To access the additional attributes you would need to do something like the following:

    using System;
    using System.Linq;
    using System.ComponentModel.DataAnnotations;
    using System.Reflection;
    
    namespace MetaDataTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                MetadataTypeAttribute[] metadataTypes = typeof(MyTestClass).GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType().ToArray();
                MetadataTypeAttribute metadata = metadataTypes.FirstOrDefault();
    
                if (metadata != null)
                {
                    PropertyInfo[] properties = metadata.MetadataClassType.GetProperties();
    
                    foreach (PropertyInfo propertyInfo in properties)
                    {
                        Console.WriteLine(Attribute.IsDefined(propertyInfo, typeof(MyAttribute)));
                        Console.WriteLine(propertyInfo.IsDefined(typeof(MyAttribute), true));
                        Console.WriteLine(propertyInfo.GetCustomAttributes(true).Length);
                        RequiredAttribute attrib = (RequiredAttribute)propertyInfo.GetCustomAttributes(typeof(RequiredAttribute), true)[0];
                        Console.WriteLine(attrib.ErrorMessage);
                    }
    
                    // Results:
                    // True
                    // True
                    // 2
                    // MyField is Required
                }
    
                Console.ReadLine();
            }
        }
    
        [MetadataType(typeof(MyMeta))]
        public partial class MyTestClass
        {
            public string MyField { get; set; }
        }
    
        public class MyMeta
        {
            [MyAttribute()]
            [Required(ErrorMessage="MyField is Required")]
            public string MyField { get; set; }
        }
    
        [AttributeUsage(AttributeTargets.All)]
        public class MyAttribute : System.Attribute
        {
        }
    }
    

    This also includes a sample attribute to show how to extract info that was added.

提交回复
热议问题