简体   繁体   English

PropertyInfo来自SubClass属性

[英]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. 使用[ Searchable ] attiribute我正试图在我可以在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 我可以得到一份PropertyInfo列表

 - Model 
 - LookUpData

How Can I Get List of PropertyInfo's to have "real name" properties: 如何获取PropertyInfo列表以获得“真实姓名”属性:

 - Model   
 - ManufacterName

Thanks in advance. 提前致谢。

Based on your clarification comment, you want to give a nested instance the name of it's property. 根据您的澄清注释,您希望为嵌套实例提供其属性的名称。 In case you don't want to name the property containing the instance with the name of its property, try the following. 如果您不想将包含具有其属性名称的实例的属性命名,请尝试以下操作。

Given the following SearchableAttribute: 给出以下SearchableAttribute:

public class SearchableAttribute : Attribute
{
    public int OrderBy { get; set; }

    public string SearchablePropertyName { get; set; }
}

You should extract the properties' attributes recursively (this is a depth-first approach, you can do it also breadth-first): 你应该递归地提取属性的属性(这是深度优先的方法,你也可以先做广度):

private static SearchableAttribute GetNestedSearchableAttribute(PropertyInfo propertyInfo)
{
    var attribute = (SearchableAttribute)Attribute.GetCustomAttribute(propertyInfo, typeof(SearchableAttribute), true);
    if (attribute == null)
    {
        return propertyInfo
            .PropertyType
            .GetProperties()
            .Select(GetNestedSearchableAttribute)
            .FirstOrDefault(attrib => attrib != null);
    }

    attribute.SearchablePropertyName = propertyInfo.Name;

    return attribute;
}

And you return not only the PropertyInfo, but an info together with the description, like this: 并且您不仅返回PropertyInfo,还返回信息以及描述,如下所示:

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

    return type
        .GetProperties()
        .Select(
            x =>
            {
                var searchableAttribute = GetNestedSearchableAttribute(x);
                var description = new
                {
                    Property = x,
                    Attribute = searchableAttribute,
                    Name = searchableAttribute == null ? x.Name : searchableAttribute.SearchablePropertyName
                };

                return description;

            })
        .OrderBy(x => x.Attribute != null ? x.Attribute.OrderBy : 200)
        .Select(x => Tuple.Create(x.Property, x.Name))
        .ToList();
}

Hope that's what you need. 希望这就是你所需要的。

This will work for all your classes if the hierarchy is one, two ,three, four levels etc too. 如果层次结构也是一个,两个,三个,四个等级,这将适用于所有类 Only thing missing is OrderBy. 唯一缺少的是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. 对于层次结构,它意味着您的LookUpData属性是否未直接在Car类中声明。例如,此代码也将完美地运行。

    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; }

    }

Try 尝试

.Select(x => new
             {
                 Property = x.Name,
                 ...

You can use an additional recursive method to collect inner properties, too. 您也可以使用其他递归方法来收集内部属性。

like this, 像这样,

    public static void GetAllSearchPropertiesWithOrderBy(Type type, ref List<PropertyInfo> result)
    {
        result = result ?? new List<PropertyInfo>();
        foreach (var propertyInfo in GetSearchPropertiesWithOrderBy(type))
        {
            result.Add(propertyInfo);
            GetAllSearchPropertiesWithOrderBy(propertyInfo.PropertyType, ref result);
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM