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

Lex*_*ebb 2 c# java reflection

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

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

Field[] fields = this.getClass().asSubclass(this.getClass()).getDeclaredFields();
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下方法在C#中获得相同的结果.但这也将返回超类的所有公共领域.

IEnumerable<FieldInfo> fields = this.GetType().GetFields().OrderBy(field => field.MetadataToken);
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以在C#中实现与Java方法相同的结果.

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

Jon*_*eet 6

你只需要使用BindingFlags.DeclaredOnly:

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

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

var fields = GetType().GetFields(BindingFlags.DeclaredOnly | 
                                 BindingFlags.Public |
                                 BindingFlags.NonPublic |
                                 BindingFlags.Static |
                                 BindingFlags.Instance)
                      .OrderBy(...);
Run Code Online (Sandbox Code Playgroud)