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,如果这有任何区别.
有想法该怎么解决这个吗?
请注意BindingFlags.FlattenHierarchy选项的小字体:
指定应返回层次结构中的公共和受保护静态成员.不返回继承类中的私有静态成员.静态成员包括字段,方法,事件和属性.不返回嵌套类型.
粗体短语中的"静态"单词是oops,不返回私有成员.要解决此问题,您需要通过Type.BaseType向上移动继承链.