关于c#:动态填充类的属性

dynamically populate properties of a class

我有以下代码,它从app.config中获取一些值,并尝试使用这些值填充类的属性。

1
2
3
4
5
6
7
8
9
10
11
12
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都是string类型,但类的属性是强类型的。我试图"松散地耦合"值和类,但我遇到了一个问题,即属性不是字符串(例如,它是一个datetime或int,甚至是我自己的类)。

有人知道我会怎么处理这样的事情吗?我应该建一个转换类还是什么?


看看自定义配置部分,它们为您提供了对app.config值的强类型访问。然后你可以随意把这个放在你的课上。

如何:使用配置节(msdn)创建自定义配置节

如何在app.config中创建自定义配置节(堆栈溢出)


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

一个简单的函数是Convert.ChangeType方法,但是它不是很可定制的,而且只限于IConvertible可以管理的类型之间的转换。如果足够的话,继续。

还有一种更易于插拔的方法:您可以使用TypeConverters。您可以从TypeDescriptor类获得TypeConverter

1
TypeDescriptor.GetConverter(targetType).ConvertFromInvariantString(configValue)

如果需要,可以定义自定义TypeConverter类。这可能比从头开始实现自己的解决方案要好,也可能不好。这取决于你的需要。