C # - вызов метода с параметром из свойства ConfigurationElement - PullRequest
0 голосов
/ 28 августа 2018

При чтении моего раздела конфигурации я хочу вызвать метод для преобразования указанного значения в ConsoleKey, если это возможно.

Мой раздел конфигурации выглядит следующим образом:

<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>

При чтении значения KeyBinding я хочу попытаться преобразовать его в ConsoleKey. В этом случае значение в конфигурации составляет 1, и я хочу преобразовать это в ConsoleKey.NumPad1.

Мой элемент конфигурации выглядит следующим образом:

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");
        }
    }
}

Я пытаюсь передать значение KeyBinding в GetConsoleKeyFromString, чтобы вернуть соответствующее ConsoleKey.

Проблема, с которой я столкнулся, заключается в том, что значение, переданное этому методу, равно null. Как я могу передать свое KeyBinding значение из моего app.config в мой GetConsoleKeyFromString, чтобы преобразовать строковое значение в ConsoleKey?

EDIT

Просто для полноты я обновил свой класс ConfigurationSection, чтобы он содержал полный код. Кроме того, я использую код ниже, чтобы попытаться получить эту конфигурацию:

var Settings = (SettingsContainer)ConfigurationManager.GetSection("SettingsContainer") as SettingsContainer;
...