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

本文关键字:类型 属性 列表 反射 获取 | 更新日期: 2023-09-27 18:33:41

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

例如:类 A 有 3 个布尔属性,调用 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;
    }

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

如果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;}要简单得多.

您可以使用 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 委托来过滤它返回的成员,但我认为它不会更简单或更快