static void ReflectType(Type settingsType, List<Setting> settings, List<Type> enumTypes,
string group)
{
object settingsInstance = Activator.CreateInstance(settingsType);
BindingFlags flags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
FieldInfo[] fields = settingsType.GetFields(flags);
foreach(FieldInfo field in fields)
{
foreach(Setting setting in settings)
if(setting.Name == field.Name)
throw new Exception(string.Format("Duplicate setting \"{0}\" detected", setting.Name));
Type fieldType = field.FieldType;
object fieldValue = field.GetValue(settingsInstance);
if(fieldType == typeof(float))
settings.Add(new FloatSetting((float)fieldValue, field, group));
else if(fieldType == typeof(int))
settings.Add(new IntSetting((int)fieldValue, field, group));
else if(fieldType == typeof(bool))
settings.Add(new BoolSetting((bool)fieldValue, field, group));
else if(fieldType.IsEnum)
{
if(enumTypes.Contains(fieldType) == false)
enumTypes.Add(fieldType);
settings.Add(new EnumSetting(fieldValue, field, fieldType, group));
}
else if(fieldType == typeof(Direction))
settings.Add(new DirectionSetting((Direction)fieldValue, field, group));
else if(fieldType == typeof(Orientation))
settings.Add(new OrientationSetting((Orientation)fieldValue, field, group));
else if(fieldType == typeof(Color))
settings.Add(new ColorSetting((Color)fieldValue, field, group));
else
throw new Exception("Invalid type for setting " + field.Name);
}
}