0

When reading my config section, I want to call a method to convert the value specified to a ConsoleKey, if possible.

My config section is as follows:

<configuration>
  <configSections>
    <section name="SettingsContainer" type="Input.SettingsContainer, Input" />
  </configSections>

  <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>

  <appSettings>    
  </appSettings>

  <SettingsContainer>
    <Bindings>
      <Binding KeyBinding="1" Description="Test description" />
    </Bindings>
  </SettingsContainer>

When reading in the KeyBinding value, I want to attempt to convert this to a ConsoleKey. In this case, the value in the configuration is 1, and I want to convert this to ConsoleKey.NumPad1.

My Configuration element is as follows:

class SettingsContainer : ConfigurationSection
{
    [ConfigurationProperty("Bindings")]
    public Bindings Bindings
    {
        get
        {
            return base["Bindings"] as Bindings;
        }
    }
}

[ConfigurationCollection(typeof(Binding), AddItemName = "Binding")]
public class Bindings : ConfigurationElementCollection, IEnumerable<Binding>
{

    protected override ConfigurationElement CreateNewElement()
    {
        return new Binding();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        var l_configElement = element as Binding;

        if (l_configElement != null) return l_configElement.KeyBinding;
        else return null;
    }

    public Binding this[int index]
    {
        get
        {
            return BaseGet(index) as Binding;
        }
    }

    IEnumerator<Binding> IEnumerable<Binding>.GetEnumerator()
    {
        return (from i in Enumerable.Range(0, this.Count)
                select this[i])
                .GetEnumerator();
    }
}

public class Binding : ConfigurationElement
{

    [ConfigurationProperty("KeyBinding", IsRequired = true)]
    public ConsoleKey KeyBinding
    {
        get
        {
            // This is where I'm attempting to pass my configuration value
            // into my method, in order to return a ConsoleKey
            return GetConsoleKeyFromString(base["KeyBinding"] as string);
        }
        set
        {
            base["KeyBinding"] = value;
        }
    }

    [ConfigurationProperty("Description", IsRequired = true)]
    public string Description
    {
        get
        {
            return base["Description"] as string;
        }
        set
        {
            base["Description"] = value;
        }
    }


    private ConsoleKey GetConsoleKeyFromString(string keyStr)
    {
        Regex rex = new Regex("^[0-9]+$");
        try
        {
            return (ConsoleKey)Enum.Parse(typeof(ConsoleKey), string.Format("NumPad{0}", keyStr), true);
        }
        catch
        {
            throw new ConfigurationErrorsException("Unknown value provided for KeyBinding");
        }
    }
}

I'm attempting to pass the KeyBinding value into the GetConsoleKeyFromString, in order to return the relevant ConsoleKey.

The issue I'm having is that the value passed into this method is null. How can I pass my KeyBinding value from my app.config into my GetConsoleKeyFromString, in order to convert the string value into a ConsoleKey?

EDIT

Just for completeness, I've updated my ConfigurationSection class to contain the full code. Additionally, I use the code below to attempt to get this configuration:

var Settings = (SettingsContainer)ConfigurationManager.GetSection("SettingsContainer") as SettingsContainer;
Community
  • 1
  • 1
devklick
  • 2,000
  • 3
  • 30
  • 47
  • How are you calling the method? Can you show the code? – Sach Aug 28 '18 at 19:19
  • @Sach, I've updated my question with the full code. Thanks – devklick Aug 28 '18 at 19:33
  • Your `config` doesn't seem to be properly formatted? It should look like this? `
    `
    – Sach Aug 28 '18 at 19:52
  • @Sach Sorry, I felt it was unnecessary to include the full app.config file contents, but I've updated my question to include this now. I'm confident that this has nothing to do with the issue, though. – devklick Aug 28 '18 at 20:06

0 Answers0