BoolOptions.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Masuit.Tools.Files;
  5. /// <summary>
  6. /// 布尔类型的特殊处理选项
  7. /// </summary>
  8. public class BoolOptions
  9. {
  10. private Dictionary<string, bool> _boolStringLookup;
  11. private string _trueString = "true";
  12. private string _falseString = "false";
  13. /// <summary>
  14. /// 非0值作为true
  15. /// </summary>
  16. public bool NonZeroNumbersAreTrue { get; set; }
  17. /// <summary>
  18. /// 构造函数
  19. /// </summary>
  20. /// <param name="comparer"></param>
  21. public BoolOptions(StringComparer comparer = null)
  22. {
  23. _boolStringLookup = new Dictionary<string, bool>(comparer ?? StringComparer.CurrentCultureIgnoreCase)
  24. {
  25. [_trueString] = true,
  26. [_falseString] = false,
  27. ["yes"] = true,
  28. ["no"] = false,
  29. ["on"] = true,
  30. ["off"] = false,
  31. ["1"] = true,
  32. ["0"] = false,
  33. ["y"] = true,
  34. ["n"] = false,
  35. };
  36. NonZeroNumbersAreTrue = true;
  37. }
  38. /// <summary>
  39. /// 设置布尔值对应的词语
  40. /// </summary>
  41. /// <param name="words"></param>
  42. /// <exception cref="ArgumentNullException"></exception>
  43. /// <exception cref="InvalidOperationException"></exception>
  44. public void SetBoolWords(IEnumerable<BoolWord> words)
  45. {
  46. if (words == null)
  47. {
  48. throw new ArgumentNullException(nameof(words));
  49. }
  50. var word = words.FirstOrDefault(w => w.Value);
  51. if (word == null)
  52. {
  53. throw new InvalidOperationException("布尔词列表不包含“true”值的条目。");
  54. }
  55. _trueString = word.Word;
  56. word = words.FirstOrDefault(w => w.Value == false);
  57. if (word == null)
  58. {
  59. throw new InvalidOperationException("布尔词列表不包含“false”值的条目。");
  60. }
  61. _falseString = word.Word;
  62. _boolStringLookup = words.ToDictionary(w => w.Word, w => w.Value);
  63. }
  64. internal string ToString(bool value) => value ? _trueString : _falseString;
  65. internal bool TryParse(string s, out bool value)
  66. {
  67. if (s != null)
  68. {
  69. if (_boolStringLookup.TryGetValue(s, out bool b))
  70. {
  71. value = b;
  72. return true;
  73. }
  74. if (NonZeroNumbersAreTrue && int.TryParse(s, out int i))
  75. {
  76. value = i != 0;
  77. return true;
  78. }
  79. }
  80. value = false;
  81. return false;
  82. }
  83. }