我想获取特定类型对象的属性列表,我已经使用这个静态方法来完成这项工作。
例如: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;
}
答案 0 :(得分:4)
如果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;}
要简单得多。
答案 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方法来过滤它返回的成员,但我认为它不会更简单或更快