You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:50:24