/// <summary>
        ///
        /// </summary>
        /// <param name="declaringType"></param>
        /// <param name="propertyName"></param>
        /// <param name="nonPublic"></param>
        /// <param name="canWrite"></param>
        /// <param name="canRead"></param>
        /// <returns></returns>
        public static PropertyInfo RetrieveMember(Type declaringType, string propertyName, bool nonPublic, bool?canWrite, bool?canRead)
        {
            if (null == declaringType)
            {
                throw new ArgumentNullException("declaringType");
            }

            else if (string.IsNullOrEmpty(propertyName))
            {
                throw new ArgumentNullException("propertyName");
            }

            var _flag     = (!nonPublic) ? BindingFlags.Public : BindingFlags.NonPublic;
            var _property = declaringType.GetProperty(propertyName, _flag | BindingFlags.Instance);

            if (null == _property)
            {
                throw new NullReferenceException(string.Format("The '{0}' property does not exist in {1}", propertyName, declaringType.FullName));
            }

            if (!PropertyMemberHelpers.CheckAccessibility(_property, canWrite, canRead))
            {
                throw new InvalidOperationException(string.Format("The '{0}' property cannot be reached", propertyName));
            }

            return(_property);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="type"></param>
        /// <param name="canWrite"></param>
        /// <param name="canRead"></param>
        /// <returns></returns>
        public static PropertyInfo[] RetrieveMembers(Type type, bool?canWrite, bool?canRead)
        {
            if (null == type)
            {
                throw new ArgumentNullException("type");
            }

            var _flag       = BindingFlags.Public | BindingFlags.NonPublic;
            var _dummy      = new ListCollection <PropertyInfo>();
            var _properties = type.GetProperties(_flag | BindingFlags.Instance);

            foreach (var _property in _properties)
            {
                if (PropertyMemberHelpers.CheckAccessibility(_property, canWrite, canRead))
                {
                    _dummy.Add(_property);
                }
            }

            return(_dummy.ToArray());
        }