【问题标题】:dynamically populate properties of a class动态填充类的属性
【发布时间】:2015-06-21 23:58:47
【问题描述】:

我有以下代码,它从我的 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 甚至是我自己的类)。

有人知道我会如何处理这样的事情吗?我应该建立一个翻译类还是什么?

【问题讨论】:

标签: c# reflection loose-coupling


【解决方案1】:

框架中有现有的实用程序可以帮助您。

一个简单的功能是Convert.ChangeType 方法,但它不是非常可定制的,并且仅限于IConvertible 可以管理的类型之间的转换。如果这足够了,请继续。

这是另一种更易于插入的方法:您可以使用TypeConverters。您可以从TypeDescriptor 类中获得TypeConverter

TypeDescriptor.GetConverter(targetType).ConvertFromInvariantString(configValue)

如果需要,您可以定义自定义 TypeConverter 类。这可能会或可能不会比从头开始实施您自己的解决方案更好。您可以根据自己的需要来决定。

【讨论】:

    【解决方案2】:

    查看自定义配置部分,它们为您提供对 app.config 值的强类型访问。然后,您可以根据需要将其松散地耦合到您的课程中。

    How to: Create Custom Configuration Sections Using ConfigurationSection (MSDN)

    How to create custom config section in app.config (stack overflow)

    【讨论】:

    • 我认为这实际上不会起作用..该值来自通过 SOAP 消息传入的数组(不是强类型的设计),只是一个字符串数组。我使用配置文件的唯一目的是找到指向数组中值的指针。对不起,我可能应该在我的问题中留下更多细节。 "Incoming_Values[ConfigurationManager.AppSettings[ReferenceKey]]"
    • @stumped221 谈到松散耦合,我认为您应该修改您的设计。在一个地方加载设置,在另一个地方使用它们,而无需关心它们的存储位置和方式。
    • 我完全同意你的看法。这对我来说是一次学习经历,所以我正在探索如何“修改我的设计”甚至定义和掌握一个好的设计松散耦合。
    猜你喜欢
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多