private List<KeyValuePair<String, object>> ParseOptions()
{
var result = new List<KeyValuePair<String, object>>();
var options = GetOptions();
var type = this.GetType();
var js = new JavaScriptSerializer();
options.Add(new WidgetOption() { Name = "disabled", DefaultValue = false });
foreach (var option in options) {
var property = type.GetProperty(option);
if (property == null) {
throw new ArgumentException("Brew Error: Widget has option defined with no matching property.", option.Name);
}
var value = property.GetValue(this);
var allow = false;
if (value == null && option.DefaultValue != null) {
allow = true;
}
else if (value != null && !value.Equals(option.DefaultValue)) {
if (value.GetType().IsArray && option.DefaultValue != null && option.DefaultValue.GetType().IsArray) {
var ienum = (IEnumerable<object>)value;
var oenum = (IEnumerable<object>)option.DefaultValue;
allow = !ienum.ItemsAreEqual(oenum);
}
else {
allow = true;
}
}
if (!allow) {
continue;
}
var outValue = value is String ? value : js.Serialize(value);
var pair = new KeyValuePair<string, object>(option.Name, outValue);
result.Add(pair);
}
return result;
}