使用反射获取特定类型的属性列表
本文关键字:类型 属性 列表 反射 获取 | 更新日期: 2023-09-27 18:33:41
我想获取特定类型的对象的属性列表,我制作了这个静态方法来完成这项工作。
例如:类 A 有 3 个布尔属性,调用 GetPropertiesList
可以吗,还是我在这里重新发明轮子?
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;
}
如果PropertyType
是T
的子类,这将不起作用。例如,如果您有此类:
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 委托来过滤它返回的成员,但我认为它不会更简单或更快