// https://stackoverflow.com/questions/9201859/why-doesnt-type-getfields-return-backing-fields-in-a-base-class private static FieldInfo[] GetFieldsIncludingBaseClasses(Type type, DisplayOption displayOptions, BindingFlags bindingFlags) { FieldInfo[] fieldInfos = type.GetFields(bindingFlags); var fields = displayOptions.IsSet(DisplayOption.Fields); var backingFields = displayOptions.IsSet(DisplayOption.BackingFields); var fieldInfoList = new HashSet <FieldInfo>(fieldInfos, FieldInfoEqualityComparer); if (displayOptions.IsSet(DisplayOption.Inherited) && type.BaseType != typeof(object)) { // collect all types up to the furthest base class var currentType = type; while (currentType != typeof(object)) { fieldInfos = currentType.GetFields(bindingFlags); fieldInfoList.UnionWith(fieldInfos); currentType = currentType.BaseType; } } if (!backingFields) { fieldInfoList.RemoveWhere(info => info.Name.EndsWith(BackingFieldSuffix)); } if (!fields) { fieldInfoList.RemoveWhere(info => !info.Name.EndsWith(BackingFieldSuffix)); } return(fieldInfoList.ToArray()); }
private void DrawUpdateIntervalSlider(bool editor) { GUILayout.BeginHorizontal(); GUILayout.Label("Update interval: "); GUILayout.BeginVertical(); if (!editor) { GUILayout.Space(10f); } childrenUpdateInterval = GUILayout.HorizontalSlider(childrenUpdateInterval, 0.01f, 1f, UpdateIntervalSliderLayout); GUILayout.EndVertical(); GUILayout.Label(childrenUpdateInterval.ToString()); GUILayout.FlexibleSpace(); var labels = DisplayOptionUtils.Names; var oldDisplayOptions = displayOptions; for (int i = 0; i < labels.Length; i++) { bool enabled = displayOptions.IsSet(i); enabled = GUILayout.Toggle(enabled, labels[i]); displayOptions = displayOptions.With(i, enabled); } ClearFieldInfoCacheIfNecessary(oldDisplayOptions); GUILayout.EndHorizontal(); }
private void ClearFieldInfoCacheIfNecessary(DisplayOption oldDisplayOptions) { var fieldsChanged = oldDisplayOptions.IsSet(DisplayOption.Fields) != displayOptions.IsSet(DisplayOption.Fields); var backingFieldsChanged = oldDisplayOptions.IsSet(DisplayOption.BackingFields) != displayOptions.IsSet(DisplayOption.BackingFields); var inheritedChanged = oldDisplayOptions.IsSet(DisplayOption.Inherited) != displayOptions.IsSet(DisplayOption.Inherited); if (fieldsChanged || backingFieldsChanged || inheritedChanged) { model.ClearObjectHandlerFieldInfoCache(); } }
public IEnumerator <Element> GetChildren(object obj, DisplayOption displayOptions) { if (displayOptions.IsSet(DisplayOption.Fields) || displayOptions.IsSet(DisplayOption.BackingFields)) { foreach (var field in GetFields(obj, displayOptions)) { yield return(field); } } if (displayOptions.IsSet(DisplayOption.Properties)) { foreach (var prop in GetProperties(obj, displayOptions)) { yield return(prop); } } }
private BindingFlags GetBindingFlags(DisplayOption displayOptions) { var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; if (!displayOptions.IsSet(DisplayOption.Inherited)) { bindingFlags |= BindingFlags.DeclaredOnly; } return(bindingFlags); }
public static bool IsSet(this DisplayOption flags, int optionIndex) { return(flags.IsSet(GetByIndex(optionIndex))); }