0

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

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

2 回答 2

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

于 2013-10-03T14:57:55.357 回答
2

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

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

更新

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

于 2013-10-03T14:51:19.437 回答