Guest User

Untitled

a guest
Nov 1st, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.88 KB | None | 0 0
  1. var cs = new MsSqlConnectionStringBuilder
  2. { User = "dmitry", Password = "Password!" }
  3. .Build();
  4.  
  5. Console.WriteLine(cs); // Password=Password!;User=dmitry;
  6.  
  7. cs = cs.With("Provider", "MSSQL");
  8. Console.WriteLine(cs); // Provider=MSSQL;Password=Password!;User=dmitry;
  9. Console.WriteLine(cs["Provider"]); // MSSQL
  10.  
  11. cs = cs.Excerpt("Provider"); // Password=Password!;User=dmitry;
  12. Console.WriteLine(cs);
  13.  
  14. public class MsSqlConnectionStringBuilder
  15. {
  16. public string User { get; set; } = "sa";
  17. public string Password { get; set; }
  18.  
  19. public ConnectionString Build() =>
  20. ConnectionString.Empty
  21. .With("User", User ?? throw new InvalidOperationException())
  22. .With("Password", Password ?? throw new InvalidOperationException());
  23. }
  24.  
  25. public sealed class ConnectionString
  26. {
  27. public static explicit operator ConnectionString(string text) => Parse(text);
  28. public static implicit operator string(ConnectionString connectionString) => connectionString.ToString();
  29.  
  30. public static readonly ConnectionString Empty = new ConnectionString(ConnectionParameter.None);
  31.  
  32. public static ConnectionString Parse(string text, string regex = "(?<name>[^=]+)=(?<value>[^;]);?") =>
  33. new ConnectionString(
  34. new Regex(regex ?? throw new ArgumentNullException(nameof(regex)))
  35. .Matches(text ?? throw new ArgumentNullException(nameof(text)))
  36. .Select(m => new ConnectionParameter(m.Groups["name"].Value, m.Groups["value"].Value)));
  37.  
  38. ConnectionString(IEnumerable<ConnectionParameter> parameters)
  39. {
  40. Parameters = parameters.ToArray();
  41. }
  42.  
  43. IEnumerable<ConnectionParameter> Parameters { get; }
  44.  
  45. public string this[string name] => Parameters
  46. .FirstOrDefault(p => p.Name.ToUpper() == name.ToUpper())?.Value;
  47.  
  48. public ConnectionString With(string name, object value) =>
  49. new ConnectionString(Parameters
  50. .Prepend(new ConnectionParameter(name, $"{value}")));
  51.  
  52. public ConnectionString Excerpt(string name) =>
  53. new ConnectionString(Enumerable.Concat(
  54. Parameters.TakeWhile(p => p.Name.ToUpper() != name.ToUpper()),
  55. Parameters.SkipWhile(p => p.Name.ToUpper() != name.ToUpper()).Skip(1)));
  56.  
  57. public override string ToString() => ToString("{0}={1};");
  58.  
  59. public string ToString(string format) =>
  60. string.Join("", from p in Parameters
  61. select string.Format(format, p.Name, p.Value));
  62. }
  63.  
  64. sealed class ConnectionParameter
  65. {
  66. public static readonly ConnectionParameter[] None = new ConnectionParameter[0];
  67.  
  68. internal ConnectionParameter(string name, string value)
  69. {
  70. Name = name ?? throw new ArgumentNullException(nameof(name));
  71. Value = value ?? throw new ArgumentNullException(nameof(value));
  72. }
  73.  
  74. public string Name { get; }
  75. public string Value { get; }
  76. }
Add Comment
Please, Sign In to add comment