public PropertyGridMember IncludeMember(string memberToInclude, Type type, MemberChangeEventHandler memberChangeAction, Func <object> getMember, TypeConverter converter = null, Attribute[] attributes = null)
        {
            if (mNativePropertyGridMembers.ContainsMember(memberToInclude))
            {
                mNativePropertyGridMembers.RemoveMember(memberToInclude);
            }

            PropertyGridMember pgm = new PropertyGridMember();

            pgm.MemberChange    = memberChangeAction;
            pgm.CustomGetMember = getMember;
            pgm.Name            = memberToInclude;
            pgm.Type            = type;
            pgm.TypeConverter   = converter;
            pgm.Attributes.Clear();

            if (attributes != null)
            {
                pgm.Attributes.AddRange(attributes);
            }

            if (getMember != null && memberChangeAction == null)
            {
                pgm.IsReadOnly = true;
                pgm.Attributes.Add(new ReadOnlyAttribute(true));
            }

            mCustomPropertyGridMembers.Add(pgm);

            return(pgm);
        }
        public PropertyDescriptorCollection AddProperty(PropertyDescriptorCollection pdc, string propertyName, Type propertyType, TypeConverter converter,
                                                        Attribute[] attributes, MemberChangeEventHandler eventArgs, Func <object> getMember)
        {
            List <PropertyDescriptor> properties = new List <PropertyDescriptor>(pdc.Count);

            for (int i = 0; i < pdc.Count; i++)
            {
                PropertyDescriptor pd = pdc[i];

                if (pd.Name != propertyName)
                {
                    properties.Add(pd);
                }
            }

            // If it doesn't have
            // events for getting and
            // setting the value, then
            // the variable is part of the
            // type itself.  Objects can't have
            // fields/properties with spaces in them
            // so this is an invalid property.  The name
            // is either wrong or the user should have passed
            // in get and set methods.
            if (propertyName.Contains(' ') && (getMember == null || eventArgs == null))
            {
                throw new ArgumentException("The member cannot have spaces in the name if it doesn't have getters and setters explicitly set");
            }

            ReflectingParameterDescriptor epd = new ReflectingParameterDescriptor(propertyName, attributes);

            epd.SetComponentType(propertyType);
            epd.Instance          = CurrentInstance;
            epd.MemberChangeEvent = eventArgs;
            epd.CustomGetMember   = getMember;
            epd.TypeConverter     = converter;



            properties.Add(epd);

            //PropertyDescriptor propertyDescriptor;

            return(new PropertyDescriptorCollection(properties.ToArray()));
        }
		public static PropertyDescriptorCollection AddProperty(PropertyDescriptorCollection pdc, string propertyName, Type propertyType, TypeConverter converter,
            Attribute[] attributes, MemberChangeEventHandler eventArgs, Func<object> getMember)
        {
            List<PropertyDescriptor> properties = new List<PropertyDescriptor>(pdc.Count);

            for (int i = 0; i < pdc.Count; i++)
            {
                PropertyDescriptor pd = pdc[i];

                if (pd.Name != propertyName)
                {
                    properties.Add(pd);
                }
            }

            // If it doesn't have
            // events for getting and
            // setting the value, then
            // the variable is part of the
            // type itself.  Objects can't have
            // fields/properties with spaces in them
            // so this is an invalid property.  The name
            // is either wrong or the user should have passed
            // in get and set methods.
            if (propertyName.Contains(' ') && (getMember == null || eventArgs == null))
            {
                throw new ArgumentException("The member cannot have spaces in the name if it doesn't have getters and setters explicitly set");
            }

            ReflectingParameterDescriptor epd = new ReflectingParameterDescriptor(propertyName, attributes);
            epd.SetComponentType(propertyType);
            epd.Instance = CurrentInstance;
            epd.MemberChangeEvent = eventArgs as MemberChangeEventHandler;
            epd.CustomGetMember = getMember;
            epd.TypeConverter = converter;
                


            properties.Add(epd);            

            //PropertyDescriptor propertyDescriptor;

            return new PropertyDescriptorCollection(properties.ToArray());
             
        }
        public PropertyGridMember IncludeMember(string memberToInclude, Type type, MemberChangeEventHandler memberChangeAction, Func<object> getMember, TypeConverter converter = null, Attribute[] attributes = null)
        {
            if (mNativePropertyGridMembers.ContainsMember(memberToInclude))
            {
                mNativePropertyGridMembers.RemoveMember(memberToInclude);
            }

            PropertyGridMember pgm = new PropertyGridMember();
            pgm.MemberChange = memberChangeAction;
            pgm.CustomGetMember = getMember;
            pgm.Name = memberToInclude;
            pgm.Type = type;
            pgm.TypeConverter = converter;
            pgm.Attributes.Clear();

            if (attributes != null)
            {
                pgm.Attributes.AddRange(attributes);
            }

            if (getMember != null && memberChangeAction == null)
            {
                pgm.IsReadOnly = true;
                pgm.Attributes.Add(new ReadOnlyAttribute(true));
            }

            mCustomPropertyGridMembers.Add(pgm);

            return pgm;
        }