Java到C#的转换,查找带有反射的子类的公共字段

本文关键字:子类 反射的 字段 查找 转换 Java | 更新日期: 2023-09-27 18:25:34

我目前正在将一个框架的一部分从java移植到C#。

我在Java中使用了以下行,按照抽象类的子类的声明顺序来获取已声明的字段。然后我会使用这个字段列表通过反射来设置值。

Field[] fields = this.getClass().asSubclass(this.getClass()).getDeclaredFields();

我已经尝试使用以下方法在C#中获得相同的结果。但这也将返回超级类的所有公共字段。

IEnumerable<FieldInfo> fields = this.GetType().GetFields().OrderBy(field => field.MetadataToken);

有没有什么方法可以让我在C#中获得与Java方法相同的结果。

重复一遍,我只需要当前类的任何子类的声明字段。

Java到C#的转换,查找带有反射的子类的公共字段

您只需要使用BindingFlags.DeclaredOnly:

指定只应考虑在所提供类型的层次结构级别声明的成员。不考虑继承的成员。

例如,假设您也想要私有字段,以及实例和静态字段-删除不想要的标志:

var fields = GetType().GetFields(BindingFlags.DeclaredOnly | 
                                 BindingFlags.Public |
                                 BindingFlags.NonPublic |
                                 BindingFlags.Static |
                                 BindingFlags.Instance)
                      .OrderBy(...);

通过BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly