1 using System.Collections.Generic;
2 using System.Text;
3 using System.IO;
4 5 namespace ESG.Utilities
6 {7 public class TextWriterProxy : TextWriter
8 {9 // store TextWriters here
10 private List<TextWriter> _writers = new List<TextWriter>();
11 12 #region Properties
13 14 /// <summary>
15 /// This property returns Encoding.Default. The TextWriters in the
16 /// TextWriterProxy collection can have any encoding. However, this
17 /// property is required.
18 /// </summary>
19 public override Encoding Encoding { get { return Encoding.Default; } }
20 21 /// <summary>
22 /// Gets or sets the line terminator string used by the TextWriters in
23 /// the TextWriterProxy collection.
24 /// </summary>
25 public override string NewLine
26 {27 get
28 {29 return base.NewLine;
30 } 31 32 set
33 {34 foreach (TextWriter tw in _writers)
35 tw.NewLine = value;
36 37 base.NewLine = value;
38 } 39 } 40 41 #endregion
42 43 #region Methods
44 45 /// <summary>
46 /// Add a new TextWriter to the TextWriterProxy collection. Setting properties
47 /// or calling methods on the TextWriterProxy will perform the same action on
48 /// each TextWriter in the collection.
49 /// </summary>
50 /// <param name="writer">The TextWriter to add to the collection</param>
51 public void Add(TextWriter writer)
52 {53 // don't add a TextWriter that's already in the collection
54 if (!_writers.Contains(writer))
55 _writers.Add(writer); 56 } 57 58 /// <summary>
59 /// Remove a TextWriter from the TextWriterProxy collection.
60 /// </summary>
61 /// <param name="writer">The TextWriter to remove from the collection</param>
62 /// <returns>True if the TextWriter was found and removed; False if not.</returns>
63 public bool Remove(TextWriter writer)
64 {65 return _writers.Remove(writer);
66 } 67 68 69 // this is the only Write method that needs to be overridden
70 // because all of the Write methods in a TextWriter ultimately
71 // end up calling Write(char)
72 73 /// <summary>
74 /// Write a character to the text stream of each TextWriter in the
75 /// TextWriterProxy collection.
76 /// </summary>
77 /// <param name="value">The char to write</param>
78 public override void Write(char value)
79 {80 foreach (TextWriter tw in _writers)
81 tw.Write(value); 82 83 base.Write(value);
84 } 85 86 /// <summary>
87 /// Closes the TextWriters in the TextWriterProxy as well as the
88 /// TextWriterProxy instance and releases any system resources
89 /// associated with them.
90 /// </summary>
91 public override void Close()
92 {93 foreach (TextWriter tw in _writers)
94 tw.Close(); 95 96 base.Close();
97 } 98 99 /// <summary>
100 /// Releases all resources used by the TextWriterProxy and by the
101 /// TextWriters in the TextWriterProxy collection.
102 /// </summary>
103 /// <param name="disposing">Pertains only to the TextWriterProxy instance:
104 /// true to release both managed and unmanaged resources; false to release
105 /// only unmanaged resources.</param>
106 protected override void Dispose(bool disposing)
107 {108 foreach (TextWriter tw in _writers)
109 tw.Dispose(); 110 111 base.Dispose(disposing);
112 } 113 114 /// <summary>
115 /// Clears all buffers for each TextWriter in the TextWriterProxy
116 /// collection and causes all buffered data to be written
117 /// to the underlying device.
118 /// </summary>
119 public override void Flush()
120 {121 foreach (TextWriter tw in _writers)
122 tw.Flush(); 123 124 base.Flush();
125 } 126 127 #endregion
128 } 129 }So far, it works great. It cleans up a lot of my code and gives me the option to write to any number of TextWriters with only one call. Further, if you are calling a method that takes a TextWriter as a parameter, you can pass the TextWriterProxy to it because it extends the TextWriter class. Here's what the usage syntax looks like:
1 // create a TextWriterProxy instance
2 TextWriterProxy proxy = new TextWriterProxy();
3 4 // add the Console.Out TextWriter
5 proxy.Add(Console.Out);
6 7 // you can still write directly to console
8 Console.WriteLine(string.Empty.PadRight(80, '='));
9 10 // add a StreamWriter for a FileStream
11 FileStream fs = new FileStream("C:\\TestExportFileAutoGen.abx", FileMode.Create);
12 StreamWriter resultWriter = new StreamWriter(fs);
13 proxy.Add(resultWriter); 14 15 // add a StringWriter for a StringBuilder
16 StringBuilder sb = new StringBuilder();
17 StringWriter resultStringWriter = new StringWriter(sb);
18 proxy.Add(resultStringWriter); 19 20 // call a method that takes a TextWriter
21 ClientSync.GenerateSessionDataExport("Sync.ServerExport", proxy);
22 23 // write directly to the TextWriterProxy
24 proxy.WriteLine("Export Complete!");
25 26 // close all of my writers
27 proxy.Close();And there you have it. A TextWriterProxy class to write to multiple TextWriters at once.