示例代码:
编辑:澄清的例子。抱歉给您带来任何混乱。
using System.Collections.Specialized;
using System.Configuration;
...
// get collection 1
NameValueCollection c1 = ConfigurationManager.AppSettings;
// get collection 2
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = "c:\\SomeConfigFile.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
KeyValueConfigurationCollection c2 = config.AppSettings.Settings;
// do something with collections
DoSomethingWithCollection(c1);
DoSomethingWithCollection(c2);
...
private void DoSomethingWithCollection(KeyValueConfigurationCollection c)
{
foreach(KeyValueConfigurationElement el in c)
{
string key = el.Key;
string val = el.Value;
// do something with key and value
}
}
private void DoSomethingWithCollection(NameValueCollection c)
{
for(int i=0; i < c.Count; i++)
{
string key = c.GetKey(i);
string val = c.Get(i);
// do something with key and value
}
}
当前有两个版本的DoSomethingWithCollection可以使用NameValueCollection或KeyValueConfigurationCollection。
有没有更干净的方法可以做到,所以只有DoSomethingWithCollection的一个版本?
谢谢。
最佳答案
好吧,DoSomethingWithCollection应该接受两个参数-1)ICollection / IEnumerable,它将允许您枚举所有值2)委托将获取对象,并返回键和值。因此,您实际上需要编写两种不同的方法来解析两种类型的集合的项目。
编辑:给出想法的示例代码。
delegate void KeyValueItemParser(object item, out string key, out string value);
void DoSomethingWithCollection(ICollection items, KeyValueItemParser parser)
{
string key, value
foreach(object item in items)
{
parser(item, out key, out value);
// do whatever you want to with key & value
}
}
编辑2:不确定不需要委托的意思-如果需要DoSomethingWithCollection的一个版本,则至少需要一些可以在两个集合中工作的代码。委托将是最简单的方法。另一种方法是定义一个接口,该接口将提供NamedValuePair / KeyValuePair的集合/枚举,然后写入实现该接口的包装器类以用于不同类型的目标集合。模板代码应为
interface IKeyValuePairCollection
{
int Count {get; }
KeyValuePair<string, string> Item(int index) { get; }
}
class NamedValueCollectionWrapper : IKeyValuePairCollection
{
private NamedValueCollection _inner;
public NamedValueCollectionWrapper(NamedValueCollection target)
{
-inner = target;
}
// roll out ur implementation to IKeyValuePairCollection
}
class KeyValueConfigurationCollectionWrapper : IKeyValuePairCollection
{
...
}
IMO,为一个简单的要求而做的太多工作。