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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:07:22