使用反射获取特定类型的属性列表

时间:2013-10-03 14:48:27

标签: c# reflection

我想获取特定类型对象的属性列表,我已经使用这个静态方法来完成这项工作。

例如:A类有3个bool属性,调用GetPropertiesList<布尔>(AINSTANCE);将返回包含所有bool返回属性的列表。

这样可以,还是我在这里重新发明轮子?

    public static List<T> GetPropertiesList<T>(object obj)
    {
        var propList = new List<T>();
        PropertyInfo[] properties = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
        //search
        foreach (PropertyInfo prop in properties)
        {
            if (prop.PropertyType != typeof(T)) { continue; }

            else
            {
                //Add to list
                var foundProp = (T)prop.GetValue(obj, null);
                propList.Add(foundProp);
            }
        }
        return propList;
    }

2 个答案:

答案 0 :(得分:4)

如果PropertyTypeT的子类,则无效。例如,如果您有这个类:

class SomeImages{
    public Bitmap Img1{get;set;}
    public Image Img2{get;set;}
}

然后GetProperties<Image>(instanceOfSomeImages)只返回Img2。同样,GetProperties<Bitmap>(instanceOfSomeImages)只会返回Img1。

您应该执行prop.PropertyType != typeof(T)

,而不是将您的支票设为typeof(T).IsAssignableFrom(prop.PropertyType)

最后,有一个if(not isGood){continue;}else{doSomething;}有点草率。做if(isGood){doSomething;}要简单得多。

答案 1 :(得分:2)

您可以使用LINQ来缩短查询范围,例如:

obj.GetType()
   .GetProperties(BindingFlags.Public | BindingFlags.Instance)
   .Where(p=>typeof(T).IsAssignableFrom(p.PropertyType))
   .Select(p=>(T)p.GetValue(obj,null))
   .ToList();

<强>更新

您还可以检查接受Type.FindMembers委托的MemberFilter方法来过滤它返回的成员,但我认为它不会更简单或更快