динамически заполнять свойства класса

У меня есть следующий код, который принимает некоторые значения из моего App.config и пытается использовать их для заполнения свойств класса.

foreach (string ReferenceKey in Utilities.CSVToList(ConfigurationManager.AppSettings[source + ":Keys"]))
{
    if (ConfigurationManager.AppSettings[ReferenceKey] != null && Incoming_Values.ContainsKey(ConfigurationManager.AppSettings[ReferenceKey]))
    { 
        PropertyInfo info = MyCustomClass.GetType().GetProperty(ReferenceKey.Split(':')[1]);
        info.SetValue(MyCustomClass, Incoming_Values[ConfigurationManager.AppSettings[ReferenceKey]]);
    }
    else
    {
        return null;
    }
}

Проблема, с которой я столкнулся, заключается в том, что, очевидно, все KVP, которые я получаю из файла конфигурации, будут иметь строковый тип, но свойства класса строго типизированы. Я пытаюсь «слабо связать» значения и класс, но у меня проблема, когда свойство не является строкой (например, это datetime, int или даже мой собственный класс).

Кто-нибудь знает, как я с этим справлюсь? Должен ли я построить класс переводчика или что-то в этом роде?


person stumped221    schedule 15.04.2015    source источник
comment
Вы смотрели Convert.ChangeType?   -  person Lasse V. Karlsen    schedule 15.04.2015
comment
Я отредактировал ваше название. См. Должны ли вопросы включать «теги» в свои заголовки?, где нет единого мнения, не следует.   -  person John Saunders    schedule 15.04.2015


Ответы (2)


Во фреймворке есть утилиты, которые могут вам в этом помочь.

Одной из простых функций является метод Convert.ChangeType, но он не очень настраиваемый и ограничивается только преобразованиями между типами, которые являются частью того, что может IConvertible управлять. Если этого достаточно, продолжайте.

Вот еще один подход, более гибкий: вы можете использовать TypeConverter с. Вы можете получить TypeConverter из класса TypeDescriptor:

TypeDescriptor.GetConverter(targetType).ConvertFromInvariantString(configValue)

При необходимости вы можете определить собственные TypeConverter классы. Это может быть лучше, чем реализовать собственное решение с нуля, а может и не быть. Вам решать, в зависимости от ваших потребностей.

person Lucas Trzesniewski    schedule 15.04.2015

Взгляните на разделы настраиваемой конфигурации, они предоставляют вам строго типизированный доступ к значениям app.config. Затем вы можете передать это своим классам по своему усмотрению.

Как: создавать настраиваемые разделы конфигурации с помощью ConfigurationSection (MSDN )

Как создать настраиваемый раздел конфигурации в app.config (переполнение стека)

person Michael Sander    schedule 15.04.2015
comment
Я не думаю, что это сработает на самом деле ... значение исходит из массива, переданного через сообщение SOAP (которое не является строго типизированным по дизайну), просто массив строк. Единственное, для чего я использую файл конфигурации, - это поиск указателей на значения в массиве. Извините, мне, наверное, следовало оставить более подробную информацию в своем вопросе. Incoming_Values ​​[ConfigurationManager.AppSettings [ReferenceKey]] - person stumped221; 15.04.2015
comment
@ stumped221 Говоря о слабой связи, я думаю, вам следует пересмотреть свой дизайн. Загружайте настройки в одном месте, используйте их в другом, не заботясь о том, где и как они хранятся. - person Michael Sander; 15.04.2015
comment
Я полностью согласен с вами ... это познавательный опыт для меня, поэтому я нахожусь в пути, чтобы выяснить, как пересмотреть свой дизайн или даже определить и понять хороший дизайн, который слабо связан. - person stumped221; 15.04.2015