使用自定义属性获取所有字段(包括继承的字段)

Kev*_*ose 3 c# reflection attributes

我有一个自定义属性BacksCache,我用来标记类中的字段,当满足某些条件时需要"默认".

我正在使用以下代码:

Type type = obj.GetType();
FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy);

foreach (FieldInfo field in fields)
{
  foreach (Attribute at in field.GetCustomAttributes(true))
  if (at is BacksCache)
  {
    field.SetValue(obj, Utils.DefaultValue(field.FieldType));
  }
}
Run Code Online (Sandbox Code Playgroud)

如果类继承层次结构是扁平的,则此代码可以正常工作.也就是说,如果type是声明所有属性字段的Type ,那么一切都很棒.只要我有一个类A从哪个类下降class B(B : A)并且B有一些属性字段就会崩溃:只有声明的字段A被检测到并且"默认".

有问题的字段是private或者private volatile,如果这有任何区别.

有想法该怎么解决这个吗?

Han*_*ant 7

请注意BindingFlags.FlattenHierarchy选项的小字体:

指定应返回层次结构中的公共和受保护静态成员.不返回继承类中的私有静态成员.静态成员包括字段,方法,事件和属性.不返回嵌套类型.

粗体短语中的"静态"单词是oops,不返回私有成员.要解决此问题,您需要通过Type.BaseType向上移动继承链.