Exemplo n.º 1
0
        // 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();
            }
        }
Exemplo n.º 4
0
        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);
                }
            }
        }
Exemplo n.º 5
0
        private BindingFlags GetBindingFlags(DisplayOption displayOptions)
        {
            var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

            if (!displayOptions.IsSet(DisplayOption.Inherited))
            {
                bindingFlags |= BindingFlags.DeclaredOnly;
            }
            return(bindingFlags);
        }
Exemplo n.º 6
0
 public static bool IsSet(this DisplayOption flags, int optionIndex)
 {
     return(flags.IsSet(GetByIndex(optionIndex)));
 }