Ich muss einen Unit-Test für eine Methode schreiben, die einen Stream nimmt, der aus einer Textdatei stammt. Ich möchte so etwas wie dies zu tun:
Stream s = GenerateStreamFromString("a,b \n c,d");
Ich muss einen Unit-Test für eine Methode schreiben, die einen Stream nimmt, der aus einer Textdatei stammt. Ich möchte so etwas wie dies zu tun:
Stream s = GenerateStreamFromString("a,b \n c,d");
public static Stream GenerateStreamFromString(string s)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
Vergessen Sie nicht, Using zu verwenden:
using (var stream = GenerateStreamFromString("a,b \n c,d"))
{
// ... Do stuff to stream
}
Über die StreamWriter
nicht entsorgt werden. StreamWriter
ist nur ein Wrapper um den Basisstream und verwendet keine Ressourcen, die entsorgt werden müssen. Die Dispose
Methode schließt die zugrunde liegende Stream
dass StreamWriter
schreibt. In diesem Fall ist das die MemoryStream
wir wollen zurückkehren.
In .NET 4.5 gibt es jetzt eine Überladung für StreamWriter
die den zugrunde liegenden Stream offen hält, nachdem der Writer entsorgt wurde, aber dieser Code tut dasselbe und funktioniert auch mit anderen Versionen von .NET.
Siehe Gibt es eine Möglichkeit, einen StreamWriter zu schließen, ohne seinen BaseStream zu schließen?
Fügen Sie dies zu einer statischen String-Utility-Klasse hinzu:
public static Stream ToStream(this string str)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(str);
writer.Flush();
stream.Position = 0;
return stream;
}
Dies fügt eine Erweiterungsfunktion hinzu, so dass Sie einfach können:
using (var stringStream = "My string".ToStream())
{
// use stringStream
}
Modernisierte und leicht modifizierte Version der Erweiterungsmethoden für ToStream
:
public static Stream ToStream(this string value) => ToStream(value, Encoding.UTF8);
public static Stream ToStream(this string value, Encoding encoding)
=> new MemoryStream(encoding.GetBytes(value ?? string.Empty));
Änderung wie in @Palec's Kommentar zur Antwort von @Shaun Bowe vorgeschlagen.
Oder als Einzeiler (vorgeschlagen von @satnhak):
public static Stream ToStream(this string value, Encoding encoding = null)
=> new MemoryStream((encoding ?? Encoding.UTF8).GetBytes(value ?? string.Empty));
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.