我目前正在将一部分框架移植到来自Java的C#。
我在Java中使用以下行来按照我的抽象类的子类的声明顺序获取声明的字段。然后,我将使用此字段列表通过反射设置值。
Field[] fields = this.getClass().asSubclass(this.getClass()).getDeclaredFields();
我尝试使用以下方法在C#中获得相同的结果。但这也将返回超类的所有公共领域。
IEnumerable<FieldInfo> fields = this.GetType().GetFields().OrderBy(field => field.MetadataToken);
我是否可以通过某种方式在C#中获得与Java方法相同的结果。
重复一遍,我只需要我当前类的任何子类的声明字段。
答案 0 :(得分:6)
您只需使用BindingFlags.DeclaredOnly
:
指定只应考虑在提供的类型层次结构级别声明的成员。不考虑继承的成员。
例如,假设您也想要私有字段,以及实例和静态字段 - 删除您不想要的标记:
var fields = GetType().GetFields(BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Static |
BindingFlags.Instance)
.OrderBy(...);
答案 1 :(得分:1)
通过BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly