public PropertyController( object xiTarget, string xiPropertyName, NamedValueHolder[] xiAllowedValues) : this(xiTarget, xiPropertyName, null, xiAllowedValues) { }
public PropertyController( object xiTarget, string xiPropertyName, string xiPropertyUpdateEventName, NamedValueHolder[] xiAllowedValues) { mTarget = xiTarget; mProperty = mTarget.GetType().GetProperty(xiPropertyName); if (mProperty == null) throw new ArgumentException(string.Format("Property \"{0}\" not found on type {1}", xiPropertyName, xiTarget.GetType())); Type lPropType = mProperty.PropertyType; mAllowedValues = xiAllowedValues; if (!lPropType.IsEnum && lPropType != typeof(bool) && lPropType != typeof(System.Drawing.Color) && xiAllowedValues == null) throw new ArgumentException("If property is not enumerated or boolean, then you must provide an array of allowed values"); // have a guess at an update event name. Don't throw an exception // if we guess wrong bool lEventNameInferred = false; if (xiPropertyUpdateEventName == null) { xiPropertyUpdateEventName = string.Format("On{0}Changed", xiPropertyName); lEventNameInferred = true; } EventInfo lEv = mTarget.GetType().GetEvent(xiPropertyUpdateEventName); if (lEv == null) { if (!lEventNameInferred) throw new ArgumentException(string.Format("Event \"{0}\" not found on type {1}", xiPropertyUpdateEventName, xiTarget.GetType())); } else { if (!lEv.EventHandlerType.IsAssignableFrom(typeof(EventHandler))) { if (!lEventNameInferred) throw new ArgumentException(string.Format("Event \"{0}\" is incompatible with System.EventHandler on type {1}", xiPropertyUpdateEventName, xiTarget.GetType())); } else { lEv.AddEventHandler(mTarget, new EventHandler(this.ValueChangeHandler)); } } }