2017-09-13 216 views
2

我有一些字符串常量,我需要从多个文件访问。由于这些常量的值可能会不时变化,因此我决定将它们放在AppSettings中而不是常量类中,以便每次更改常量时都不必重新编译。C#AppSettings数组

有时我需要使用单个字符串,有时我需要一次处理所有字符串。我想要做这样的事情:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <appSettings> 
     <add key="CONST1" value="Hi, I'm the first constant." /> 
     <add key="CONST2" value="I'm the second." /> 
     <add key="CONST3" value="And I'm the third." /> 

     <add key="CONST_ARR" value=[CONST1, CONST2, CONST3] /> 
    </appSettings> 
</configuration> 

的理由是,我会那么可以做的东西一样

public Dictionary<string, List<double>> GetData(){ 
    var ret = new Dictionary<string, List<double>>(); 
    foreach(string key in ConfigurationManager.AppSettings["CONST_ARR"]) 
     ret.Add(key, foo(key)); 
    return ret; 
} 

//... 

Dictionary<string, List<double>> dataset = GetData(); 

public void ProcessData1(){ 
    List<double> data = dataset[ConfigurationManager.AppSettings["CONST1"]]; 
    //... 
} 

有没有办法做到这一点?我对此很新,我承认这可能是可怕的设计。

+0

什么是foo的方法? –

+0

@AkashKC这只是一个将字符串作为参数的方法。这个想法是,对于每个常量,我都会添加一些依赖于该常量的字典。 – Liam

+0

已发布的回覆。请看看,让我知道,如果这种方法适合你 –

回答

2

您不需要在AppSettings键中放置数组键,因为您可以从代码本身迭代AppSetting的所有键。所以,你的AppSettings应该是这样的:

<appSettings> 
    <add key="CONST1" value="Hi, I'm the first constant." /> 
    <add key="CONST2" value="I'm the second." /> 
    <add key="CONST3" value="And I'm the third." /> 
</appSettings> 

在此之后,你可以创建你可以从程序的一部分访问全局静态辞典:

public static Dictionary<string, List<double>> Dataset 
{ 
     get 
     { 
      var ret = new Dictionary<string, List<double>>(); 
      // Iterate through each key of AppSettings 
      foreach (string key in ConfigurationManager.AppSettings.AllKeys) 
       ret.Add(key, Foo(ConfigurationManager.AppSettings[key])); 
      eturn ret; 
     } 
} 

由于Foo method已经从static访问属性,您需要将Foo方法定义为静态方法。所以,你的Foo中的方法应该是这样的:

private static List<double> Foo(string key) 
{ 
    // Process and return value 
    return Enumerable.Empty<double>().ToList(); // returning empty collection for demo 
} 

现在,你可以在下面的方式通过其键访问数据集dictionary

public void ProcessData1() 
{ 
    List<double> data = Dataset["CONST1"]; 
    //... 
} 
+0

哇!现在看起来很明显。谢谢! – Liam