Search code examples
c#reflectioncustom-attributespropertyinfo

PropertyInfo From SubClass property


I have two classes:

public class LookUpData 
{
  [Searchable]
  public string ManufactureName {get;set;)
}

public class Car
{
   public int ID {get;set;}
   [Searchable]  
   public string  Model {get;set;}
   public int ManufactureId {get;set;} 
   public LookUpData LookUpData{ get;set;} 

}

With [Searchable] attiribute I'm trying to get properties on which after I can make search in DB.

Currently I have static medthod:

public static List<PropertyInfo> GetSearchPropertiesWithOrderBy(Type type)
{
  if (type == null) throw new ArgumentNullException("type");

  return type.GetProperties()
             .Select(x => new
                            {
                              Property = x,
                              Attribute =
                            (SearchableAttribute) Attribute.GetCustomAttribute(x, typeof (SearchableAttribute), true)
                            })
             .OrderBy(x => x.Attribute != null ? x.Attribute.OrderBy : 200)
             .Select(x => x.Property)
             .ToList();
}

I can get a List of PropertyInfo's

 - Model 
 - LookUpData

How Can I Get List of PropertyInfo's to have "real name" properties:

 - Model   
 - ManufacterName

Thanks in advance.


Solution

  • This will work for all your classes if the hierarchy is one, two ,three, four levels etc too. Only thing missing is OrderBy. I believe that piece can be done by you once the listing is got.

        public static List<PropertyInfo> GetSearchProperties(Type type)
        {
            if (type == null) throw new ArgumentNullException("type");
    
    
            List<PropertyInfo> propL = new List<PropertyInfo>();
            foreach (var item in type.GetProperties())
            {
                object[] obj = item.GetCustomAttributes(typeof(Searchable), true);
                if (obj.Count() > 0)
                {
                    propL.Add(item);
                }
                else
                {                    
                    propL.AddRange(GetSearchPropertiesWithOrderBy(item.PropertyType));
                }
            }
            return propL;        
        }
        [System.AttributeUsage(System.AttributeTargets.Property)]
        public class Searchable : System.Attribute
        {
    
        }
        public class LookUpData
        {
            [Searchable]
            public string ManufactureName { get; set; }
        }
    
        public class Car
        {
            public int ID { get; set; }
            [Searchable]
            public string Model { get; set; }
            public int ManufactureId { get; set; }
            public LookUpData LookUpData { get; set; }
    
        }
    

    With hierarchy it means if your LookUpData property was not declared directly in Car class For example, then too this code will work perfectly fine.

        public class MyDataModels
        {
            LookUpData MysetOfData { get; set; }
            int MyVal { get; set; }
        }
    
        public  class MyCar
        {
            public int ID { get; set; }
            [Searchable]
            public string Model { get; set; }
            public int ManufactureId { get; set; }
            public MyDataModels MyModel { get; set; }
    
        }