如何通过反射获取POCO类的所有公共属性(含枚举类型属性)
正确获取POCO类所有公共属性的反射方式
你之前的代码错误地将判断逻辑放在了属性类型的可见性上,而非属性自身的公共性,这才导致嵌套枚举类型的属性被错误排除。
问题根源
嵌套在类中的公共枚举(比如示例里的DataType),它的PropertyType.IsPublic会返回false——因为对于嵌套类型来说,IsPublic标识的是非嵌套类型的可见性,嵌套公共类型需要用IsNestedPublic判断。但实际上,我们要筛选的是属性本身是否为公共属性,和属性的类型是否公共没有直接关系。
正确实现方式
1. 获取所有公共实例属性
默认情况下,GetProperties()会返回类中所有公共的实例属性(只要属性本身用public修饰,不管setter是私有还是公共),这也是POCO类最常用的场景:
// 直接获取所有公共实例属性 var publicProperties = typeof(MetaData).GetProperties();
这条代码会包含示例里的Id、MyDataType、ParentFolder、FileName等所有public修饰的属性。
2. 仅获取同时拥有公共getter和setter的属性
如果你的需求是只保留读写都为公共的属性,可以额外过滤访问器的可见性:
var publicReadWriteProperties = typeof(MetaData).GetProperties() .Where(prop => // 检查getter是否存在且为公共 prop.GetGetMethod() != null && prop.GetGetMethod().IsPublic // 检查setter是否存在且为公共 && prop.GetSetMethod() != null && prop.GetSetMethod().IsPublic);
这条代码会只保留示例里的Id属性(因为其他属性的setter是private)。
内容的提问来源于stack exchange,提问作者GisMofx
相关产品推荐
相关产品推荐

