/// <summary> /// Gets the value. /// </summary> /// <param name="sectionName">Name of the section.</param> /// <param name="keyName">Name of the key.</param> /// <param name="defaultValue">if set to <c>true</c> [default value].</param> /// <param name="booleanConverter">The boolean converter.</param> /// <returns></returns> public virtual bool GetValue(string sectionName, string keyName, bool defaultValue, BooleanConverter booleanConverter = null) { booleanConverter = booleanConverter ?? Settings.BooleanConverter; var booleanValue = GetRawValue <string>(sectionName, keyName, null); if (string.IsNullOrWhiteSpace(booleanValue)) { SetValue(sectionName, keyName, null == booleanConverter // if some day Boolean.ToString(IFormatProvider) will work // https://msdn.microsoft.com/en-us/library/s802ct92(v=vs.110).aspx#Anchor_1 ? defaultValue.ToString(Settings.Culture).ToLowerInvariant() : booleanConverter.ConvertToString(defaultValue)); return(defaultValue); } #pragma warning disable IDE0046 // Convert to conditional expression foreach (var converter in YesNoBoolConverters) { if (converter.Yes.Equals(booleanValue.Trim(), StringComparison.InvariantCultureIgnoreCase) || converter.No.Equals(booleanValue.Trim(), StringComparison.InvariantCultureIgnoreCase)) { return(converter.Yes.Equals(booleanValue, StringComparison.InvariantCultureIgnoreCase)); } } #pragma warning restore IDE0046 // Convert to conditional expression if (bool.TryParse(booleanValue, out var parseBoolean)) { return(parseBoolean); } // if some day Boolean.ToString(IFormatProvider) will work // https://msdn.microsoft.com/en-us/library/s802ct92(v=vs.110).aspx#Anchor_1 if (true.ToString(Settings.Culture).ToLowerInvariant().Equals(booleanValue, StringComparison.InvariantCultureIgnoreCase)) { return(true); } if (booleanConverter == null || !booleanConverter.CanConvertFrom(typeof(string))) { return(defaultValue); } var value = booleanConverter.ConvertFrom(booleanValue); return(value is bool convertedBoolean ? convertedBoolean : defaultValue); }
public void TestBooleanConverter() { BooleanConverter booleanConverter = new BooleanConverter(); Assert.True(booleanConverter.CanConvertTo(typeof(bool))); Assert.True(booleanConverter.CanConvertTo(typeof(Boolean))); Assert.False(booleanConverter.CanConvertTo(typeof(string))); Assert.False(booleanConverter.CanConvertTo(typeof(float))); Assert.False(booleanConverter.CanConvertTo(typeof(double))); Assert.False(booleanConverter.CanConvertTo(typeof(int))); Assert.True(booleanConverter.CanConvertFrom(" oN ")); Assert.True(booleanConverter.CanConvertFrom("OFF ")); Assert.True(booleanConverter.CanConvertFrom(" YeS")); Assert.True(booleanConverter.CanConvertFrom("No")); Assert.True(booleanConverter.CanConvertFrom("true")); Assert.True(booleanConverter.CanConvertFrom("FALSE")); Assert.True(booleanConverter.CanConvertFrom("10")); Assert.False(booleanConverter.CanConvertFrom("abc")); Assert.False(booleanConverter.CanConvertFrom("No!")); Assert.Equal(true, booleanConverter.Convert(typeof(bool), "TRUE")); Assert.Equal(false, booleanConverter.Convert(typeof(object), "fAlSe")); Assert.Equal(true, booleanConverter.Convert(typeof(bool), "on")); Assert.Equal(false, booleanConverter.Convert(typeof(object), "oFF")); Assert.Equal(true, booleanConverter.Convert(typeof(bool), "yeS")); Assert.Equal(false, booleanConverter.Convert(typeof(object), "No")); Assert.Equal(true, booleanConverter.Convert(typeof(bool), "-10")); Assert.Equal(true, booleanConverter.Convert(typeof(bool), "123")); Assert.Equal(false, booleanConverter.Convert(typeof(object), "0")); Assert.Throws <InvalidOperationException>(() => booleanConverter.Convert(typeof(object), "0.0")); Assert.Throws <InvalidOperationException>(() => booleanConverter.Convert(typeof(object), "XYZ")); }