首页 > 解决方案 > 如何在类中的属性中获取属性的自定义属性

问题描述

我的任务是设置/初始化类中所有标记有自定义属性的属性,这些属性派生到该类的属性中的类和属性。例子:

 class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            a.InjectableProperties();
        }
    }


    public class A : C
    {
        [CodeModuleProperty(ModulePropertyType.Injectable)]
        public string NameA{ get; set; }

        public B ObjB { get; set; }

        public IEnumerable<PropertyInfo> InjectableProperties()
        {
            var response = new List<PropertyInfo>();
            // get the mnodule properties
            var moduleProperties = GetType().GetProperties();
         foreach (var moduleProperty in moduleProperties)
            {
                var attribute = moduleProperty.GetCustomAttributes(typeof(CodeModulePropertyAttribute), false)
                    .FirstOrDefault();

                if (attribute != null && ((CodeModulePropertyAttribute)attribute).PropertyType ==
                    ModulePropertyType.Injectable)
                {
                    response.Add(moduleProperty);
                }
            }

            return response // Only gives A,D &C . I also want custom attributes children properties within objB;
        }
    }

在这种方法中,我还想获取属性“ClassB”的自定义属性属性以及 A、D 和 E 类的属性。如何实现?

    public class B
    {
        [CodeModuleProperty(ModulePropertyType.Injectable)]
        public string NameB { get; set; }
    }
    public class C : D
    {
        [CodeModuleProperty(ModulePropertyType.Injectable)]
        public string NameC { get; set; }
    }

    public class D
    {
        [CodeModuleProperty(ModulePropertyType.Injectable)]
        public string NameD { get; set; }
    }

    [AttributeUsage(AttributeTargets.Property)]
    public class CodeModulePropertyAttribute : Attribute
    {
        public CodeModulePropertyAttribute(ModulePropertyType propertyType)
        {
            PropertyType = propertyType;
        }

        public ModulePropertyType PropertyType { get; set; }


    }

    public enum ModulePropertyType
    {
        Injectable = 1,
        DynamicConfiguration = 2
    }

标签: c#.netinheritancereflectionattributes

解决方案


对于财产

object attr = typeof(MyClass)
              .GetProperty("NameB")
              .GetCustomAttributes(typeof(CodeModuleProperty), false)
              .FirstOrDefault();

上课

object attr = typeof(MyClass)
              .GetCustomAttributes(typeof(CodeModuleProperty), false)
              .FirstOrDefault();

如果您想检查所有属性,只需执行.GetProperties并迭代它们for-each并调用GetCustomAttributes


推荐阅读