2017-09-04 109 views
1

嘗試處理(內部)KeyValueConfigurationCollection例外情況,當值來自其索引器不存在時,我出現錯誤。無法從KeyValueConfigurationCollection轉換爲派生類

public class ConfigCore 
{ 

    public static Configuration config 
    { 
     get 
     { 
      ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap(); 
      configFileMap.ExeConfigFilename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "App.config"); 
      return ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None); 
     } 
    } 

    public static SettingsManager Settings 
    { 
     get 
     { 
      //config is an instance of System.Configuration.Configuration and works well. 
      return (SettingsManager) config.AppSettings.Settings; 
     } 
    } 

    internal static KeyValueConfigurationCollection Setts 
    { 
     get 
     { 
      return config.AppSettings.Settings; 
     } 
    } 

    public static void CreateSettingEntry(string key, string value) 
    { 
     try 
     { 
      Setts.Add(key, value); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Error ocurred trying to add value to Config. Message: {0}", ex.ToString()); 
     } 
    } 
} 

public class SettingsManager : KeyValueConfigurationCollection 
{ 
    public KeyValueConfigurationElement this[string key] 
    { 
     get 
     { 
      if (ConfigCore.Setts[key] == null) 
       ConfigCore.CreateSettingEntry(key, ""); 
      return ConfigCore.Setts[key]; 
     } 
    } 
} 

我想避免用戶做以下的事情用我的API:

if(ConfigCore.Settings["key"] == null) 
    ConfigCore.CreateSettingEntry("key", ""); 

ConfigCore.Settings["key"].Value = "value"; 

而且通過這個原因,我已經創建了一個內部的索引搜索此情況下並自動調用該方法在設置之前創建條目。

但由於某種原因,發生異常,說KeyValueConfigurationCollection不能被鑄造成SettingsManager,爲什麼如果SettingsManager是繼承類KeyValueConfigurationCollection,我忘了什麼?

在此先感謝!

回答

1

我一直在就這個問題就在今天。

public static class KeyValueConfigurationCollectionExtension 
    { 
     public static bool ContainsKey<T>(T key) 
     { 
      System.Collections.Specialized.NameValueCollection coll = new System.Collections.Specialized.NameValueCollection(); 

      string keyValue = key.ToString(); 
      int upperBound = coll.Count; 
      List<string> items = new List<string>(); 
      for(int i = 0; i < upperBound; i++) 
      { 
       items.Add(coll[i].ToString()); 
      } 

      int index = items.IndexOf(keyValue); 
      if(index >= 0) 
       return true; 

      return false; 

     } 
    } 
+0

這個想法是找到一個內部計數,它可以在撰寫本文時使用(截至2018年1月18日)。 –