У меня есть один БОЛЬШОЙ .ini файл. e.c:
[Globals]
EdgeDkShadowColor = 188 196 218
EdgeFillColor = 244 244 244
[SysMetrics]
ActiveCaption = 207 214 232
Background = 58 110 165
Btnface = 244 244 244
...
[Button.Checkbox]
AccentColorHint = 250 196 88
Bgtype = imagefile
BorderColorHint = 29 82 129
FillColorHint = 33 161 33
...
[Button.Checkbox(Checkeddisabled)]
TextColor = 161 161 146
[Button.Checkbox(Mixeddisabled)]
TextColor = 161 161 146
[Button.Checkbox(Uncheckeddisabled)]
TextColor = 161 161 146
И я создаю статический класс. Я хочу перечислить строки .ini и установить значение для всех полей из класса Parameters.
Структура класса:
public static class Parameters
{
public static class Globals
{
public static string EdgeDkShadowColor;
public static string EdgeFillColor;
...
}
public static class SysMetrics
{
public static string ActiveCaption;
public static string Background;
public static string Btnface;
...
}
public static class Button
{
public static class Checkbox
{
public static string AccentColorHint;
public static string Bgtype;
public static string BorderColorHint;
}
public static class Checkbox_Checkeddisabled
{
public static string TextColor;
}
public static class Checkbox_Mixeddisabled
{
public static string TextColor;
}
public static class Checkbox_Uncheckeddisabled
{
public static string TextColor;
}
...
Как я могу правильно перечислить все поля из класса и инициализировать их, чтобы в конечном итоге получить объект:
Parameters.
Globals.
EdgeDkShadowColor = "188 196 218";
EdgeFillColor = "244 244 244";
SysMetrics.
ActiveCaption = "207 214 232"
Background = "58 110 165"
Btnface = "244 244 244"
...
Button.
Checkbox.
AccentColorHint = "250 196 88"
Bgtype = "imagefile"
BorderColorHint = "29 82 129"
... etc.
P.S.
- Все значения строковые.
- '(' в названии заменено на '_'.
- Имя параметра может содержать строку «::». Заменяется на «Ext».
ОБНОВЛЕНИЕ
Я нашел первый код этой задачи. Я пытаюсь использовать эту функцию: Основная часть кода
StringReader str = new StringReader(fileAsString);
string line;
Type curType = null;
while ((line = str.ReadLine()) != null)
{
if (string.IsNullOrEmpty(line) | line.StartsWith(";")) continue;
if (line.Contains('['))
{
line = line[0] + line[1].ToString().ToUpper() + line.Substring(2);
var listing = typeof(Parameters).GetNestedTypes().ToList();
string lineS = line.Trim('[').Trim(']').Trim(')').
Replace("(", "_").Replace("::", "Ext").Trim();
var listingOf = listing.Find(tipe => tipe.Name == lineS);
curType = listingOf;
}
else
{
if (curType != null)
{
FieldInfo found = curType.GetField(splits[0].Trim(')').Replace("(", "_").Trim());
if (found != null)
found.SetValue(null, splits[1].Trim());
}
}
}
Это работа, но только для одного уровня. Это результат работы этого кода: