Вы не добавляете KeyVlauePair
s в словарь, поэтому GetStringValue
всегда будет нулевым.
См. Этот пример, который должен работать:
[Test]
public void Test()
{
var settings = new DiagnosticsSettings { ["Today"] = "SomeValue" };
var value = settings.GetEnumValue<CreatedOn>(CreatedOn.Today.ToString());
Assert.AreEqual(1, value);
}
Вкл. другое примечание, наследование от класса, такого как Dictionary
, редко является хорошей практикой. Он обеспечивает много поведения, большинство из которого вы, вероятно, не хотите показывать потребителям.
Лучшим подходом может быть использование композиции:
public class DiagnosticsSettings
{
private Dictionary<string, string> _dict = new Dictionary<string, string>();
public string GetStringValue(string settingName)
{
return _dict.TryGetValue(settingName, out var result) ? result : throw new UnknownDiagnosticSettingException($"Unable to locate setting with name {settingName}.");
}
public T GetEnumValue<T>(string settingName)
{
var stringValue = GetStringValue(settingName);
if (string.IsNullOrWhiteSpace(stringValue))
throw new UnknownDiagnosticSettingException($"Unable to locate setting with name { settingName }");
return (T)Enum.Parse(typeof(T), stringValue);
}
}
, которая только разоблачает желаемое поведение.
Если вы хотите сохранить инициализатор словаря, вам также потребуется реализовать IEnumerable
и Add(string, string)
:
public class DiagnosticsSettings : IEnumerable
{
// ...
public void Add(string arg1, string arg2)
{
_dict.Add(arg1, arg2);
}
IEnumerator IEnumerable.GetEnumerator()
{
return _dict.GetEnumerator();
}
}