2015-04-15 36 views
0

我有下面的代码,它从我的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都将是字符串类型,但类的属性是强类型。我试图“松散地耦合”值和类,但我有一个问题,该属性不是一个字符串(例如它是一个日期时间或一个int,甚至是我自己的一个类)。

有没有人有任何想法我会如何处理这样的事情?我应该建一个翻译课还是什么?

+0

你有没有看'Convert.ChangeType'? –

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

回答

1

框架中有一些可以帮助你的实用工具。

一个简单的功能是Convert.ChangeType方法,但它不是非常可定制的,只限于IConvertible可以管理的类型之间的转换。如果这足够了,继续。可以使用TypeConverter s。您可以从TypeDescriptor类获得TypeConverter

TypeDescriptor.GetConverter(targetType).ConvertFromInvariantString(configValue) 

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

1

看看自定义配置部分,它们为您提供对app.config值的强类型访问。如果你愿意,你可以随意将它们放到你的课堂上。

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

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

+0

我不认为这将实际上工作..价值来自通过SOAP消息传递的数组(这不是由设计强类型),只是一个字符串数组。我使用配置文件的唯一方法是找到指向数组中值的指针。对不起,我可能应该在我的问题中留下更多细节。 “Incoming_Values [ConfigurationManager.AppSettings [ReferenceKey]]” – stumped221

+0

@ stumped221谈到松耦合,我认为你应该修改你的设计。将设置加载到一个地方,在其他地方使用它们,而不必关心它们在哪里以及如何存储。 –

+0

我完全同意你的看法。这对我来说是一次学习体验,所以我正在寻找如何“修改我的设计”,甚至定义和掌握松散耦合的优秀设计。 – stumped221