C#反射获取类公共静态字段返回空列表,求技术解惑
问题分析与修复方案
嘿,刚从Java转C#很容易踩这类语法坑,我帮你揪出问题所在啦!
核心错误:类型判断用错了运算符
你在GetFieldValues<T>里的这行判断逻辑完全不对:
.Where(f => f.FieldType is T)
在C#里,is是用来判断某个对象是不是指定类型的实例(类似Java的instanceof),但f.FieldType本身是个Type对象,而T是MaterialType,所以这个条件永远会返回false——相当于你在问“一个Type对象是不是MaterialType的实例”,这显然不成立,所有字段都被过滤掉了,列表自然为空。
修正后的代码
把类型判断改成直接比较字段类型的元数据和T的元数据就好:
public static List<T> GetFieldValues<T>() { return typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static) .Where(f => f.FieldType == typeof(T)) // 这里是关键修正 .Select(f => (T)f.GetValue(null)) .ToList(); }
给Java转C#新手的小提示
- C#里的
typeof(T)对应Java里的T.class,用来获取类型的元数据对象; - 如果之后遇到需要判断子类兼容的场景,可以用
f.FieldType.IsAssignableFrom(typeof(T)),但你的MaterialType是密封类(sealed),用==更精准高效; - 反射获取静态字段时,
GetValue(null)是正确的,这点和Java一致,不用改。
现在再调用MaterialType.Values(),就能拿到你想要的三个MaterialType实例的列表啦!
内容的提问来源于stack exchange,提问作者Gerolmed
相关产品推荐
相关产品推荐

