public Dictionary <PropertyInfo, PropertyMapping> FindAllowedProperties(
            TypeInfo objectType, DescriptorActions actions = DescriptorActions.Read,
            string[] whitelist = null,
            string[] blacklist = null)
        {
            if (objectType == null)
            {
                throw new ArgumentNullException(nameof(objectType));
            }

            var actionable = new Dictionary <PropertyInfo, PropertyMapping>();

            var ignoreIsWritable = !actions.HasFlag(DescriptorActions.Read);

            foreach (var pi in objectType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                var attributes = pi.GetCustomAttributes(true);

                if ((ignoreIsWritable || pi.CanWrite) && IsActionableProperty(pi, attributes, actions))
                {
                    actionable.Add(pi, new PropertyMapping(pi, ResolveAlias(pi, attributes)));
                }
            }

            return(actionable);
        }
        public Dictionary<PropertyInfo, PropertyMapping> FindAllowedProperties(
            Type objectType, DescriptorActions actions = DescriptorActions.Read,
            string[] whitelist = null,
            string[] blacklist = null)
        {
            if (objectType == null)
                throw new ArgumentNullException(nameof(objectType));

            var actionable = new Dictionary<PropertyInfo, PropertyMapping>();

            var ignoreIsWritable = !actions.HasFlag(DescriptorActions.Read);

            foreach (var pi in objectType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                var attributes = pi.GetCustomAttributes(true);

                if ((ignoreIsWritable || pi.CanWrite) && IsActionableProperty(pi, attributes, actions))
                    actionable.Add(pi, new PropertyMapping(pi, ResolveAlias(pi, attributes)));
            }

            return actionable;
        }