У меня есть высший класс с вложенными классами
public class Preferences
{
public FunctionClass function { get; set; } = new FunctionClass();
public class FunctionClass
{
public string programfolder { get; set; } = "";
...
}
public LoggerClass logger { get; set; } = new LoggerClass();
public class LoggerClass
{
public string logFolder { get; set; } = "Log";
...
}
public OptionClass options { get; set; } = new OptionClass();
public class OptionClass
{
public bool showGraphics { get; set; } = true;
...
}
public MqttSpSetupClass MqttSpSetup { get; set; } = new MqttSpSetupClass();
public class MqttSpSetupClass
{
public string strAddress { get; set; } = "localhost";
...
}
}
поэтому я хочу, чтобы отражение зацикливалось на всех членах каждого внутреннего класса
PropertyInfo[] props_Outer = typeof(IoAppPreferences).GetProperties();
int counter = 0;
foreach (PropertyInfo prop_Upper in props_Outer)
{
var sName_Outer = prop_Upper.Name;
var val_Outer = props_Outer.GetValue(counter ++);
PropertyInfo[] properties_Inner;
switch (sName_Outer.ToUpper())
{
case "DIMS": properties_Inner = typeof(IoAppPreferences.DimsClass).GetProperties(); break;
...
}
foreach (PropertyInfo prop_Inner in properties_Inner)
{
var sName = prop_Inner.Name;
//prefs.function
var sVal = prop_Inner.GetValue(val_Outer);<------ERROR
switch (prop_Inner.Name.ToUpper())
{
...
}
}
Я получаю сообщение об ошибке, где я поставил стрелку. И причина в том, что val_Outer является функцией FunctionClass, а если я жестко запрограммирую prefs.function, все в порядке. Конечно, я могу поставить переключатель на каждый из них, но мой вопрос: есть ли лучший способ решить эту проблему?
Я видел это решение, но оно не соответствует моим потребностям
хе-хе, теперь я вижу это .. это Array.GetValue
, что по-прежнему делает val_Outer
PropertyInfo
не значением свойства ... (если быть точным, теперь у вас есть val_Outer
== prop_Upper
)
Кроме того, почему вы используете отражения? это похоже на загрузку некоторых настроек/настроек... как они хранятся? как json? почему бы вам просто не сгенерировать модель С# из json, а затем просто десериализовать их
Я использую отражение, потому что мне нужно проверить правильность каждого члена
Вы получили ошибку, потому что val_Outer
— неправильный экземпляр. Вы пытаетесь получить значение из целого числа счетчика props_Outer.GetValue(counter ++)
Если ваша цель — получить значения свойств из вложенных классов, у вас должен быть экземпляр объекта Preferences:
var appPreferences = new Preferences();
var propsOuter = appPreferences.GetType().GetProperties();
foreach (var po in propsOuter)
{
var valueOuter = po.GetValue(appPreferences);
Console.WriteLine($"{po.Name}");
if (valueOuter == null) continue;
var propsInner = valueOuter.GetType().GetProperties();
foreach (var pi in propsInner)
{
var valueInner = pi.GetValue(valueOuter);
Console.WriteLine($"{pi.Name}: {valueInner}");
}
}
Но получение значений через отражение практически бесполезно, если у вас уже есть экземпляр объекта.
Какая ошибка? ....