private static UIDropDown AddDynamicDropdown <T>(this UIHelperBase group, string text, string propertyName, IList <string> items, Action <string> action) where T : IModOptions
        {
            var property      = typeof(T).GetProperty(propertyName);
            var defaultString = (string)property.GetValue(OptionsWrapper <T> .Options, null);
            int defaultSelection;

            try
            {
                defaultSelection = items.IndexOf(defaultString);
            }
            catch
            {
                defaultSelection = 0;
                property.SetValue(OptionsWrapper <T> .Options, items[0], null);
            }

            Debug.Log("Option Items");
            Debug.Log(items.ToString());

            return((UIDropDown)group.AddDropdown(text, items.ToArray(), defaultSelection, sel =>
            {
                var selection = items[sel];
                property.SetValue(OptionsWrapper <T> .Options, selection, null);
                OptionsWrapper <T> .SaveOptions();
                action.Invoke(selection);
            }));
        }
        private static UITextField AddTextField <T>(this UIHelperBase group, string text, string propertyName, Action <string> action) where T : IModOptions
        {
            var property     = typeof(T).GetProperty(propertyName);
            var initialValue = Convert.ToString(property.GetValue(OptionsWrapper <T> .Options, null));

            return((UITextField)group.AddTextfield(text, initialValue, s => { },
                                                   s =>
            {
                object value;
                if (property.PropertyType == typeof(int))
                {
                    value = Convert.ToInt32(s);
                }
                else if (property.PropertyType == typeof(short))
                {
                    value = Convert.ToInt16(s);
                }
                else if (property.PropertyType == typeof(double))
                {
                    value = Convert.ToDouble(s);
                }
                else if (property.PropertyType == typeof(float))
                {
                    value = Convert.ToSingle(s);
                }
                else
                {
                    value = s;     //TODO: more types
                }
                property.SetValue(OptionsWrapper <T> .Options, value, null);
                OptionsWrapper <T> .SaveOptions();
                action.Invoke(s);
            }));
        }
        private static UICheckBox AddCheckbox <T>(this UIHelperBase group, string text, string propertyName, Action <bool> action) where T : IModOptions
        {
            var property = typeof(T).GetProperty(propertyName);

            return((UICheckBox)group.AddCheckbox(text, (bool)property.GetValue(OptionsWrapper <T> .Options, null),
                                                 b =>
            {
                property.SetValue(OptionsWrapper <T> .Options, b, null);
                OptionsWrapper <T> .SaveOptions();
                action.Invoke(b);
            }));
        }
        private static UIDropDown AddDropdown <T>(this UIHelperBase group, string text, string propertyName, IList <KeyValuePair <string, int> > items, Action <int> action) where T : IModOptions
        {
            var property    = typeof(T).GetProperty(propertyName);
            var defaultCode = (int)property.GetValue(OptionsWrapper <T> .Options, null);
            int defaultSelection;

            try
            {
                defaultSelection = items.First(kvp => kvp.Value == defaultCode).Value;
            } catch {
                defaultSelection = 0;
                property.SetValue(OptionsWrapper <T> .Options, items.First().Value, null);
            }
            return((UIDropDown)group.AddDropdown(text, items.Select(kvp => kvp.Key).ToArray(), defaultSelection, sel =>
            {
                var code = items[sel].Value;
                property.SetValue(OptionsWrapper <T> .Options, code, null);
                OptionsWrapper <T> .SaveOptions();
                action.Invoke(code);
            }));
        }