如何重置位置在StringReader字符串的开始
本文关键字:字符串 开始 StringReader 何重置 位置 | 更新日期: 2023-09-27 18:06:50
我有以下代码:
StringReader contentReader = new StringReader(this.dataContent.ToString());
在我解析我的datcontent之后,我需要将contentReader的毒害重置为字符串的开头。我该怎么做呢?我在StringReader
设置为StringReader的一个新实例。我不相信你可以改变一个已经存在的位置。
contentReader = new StringReader(this.dataContent.ToString());
另一种选择是将字符串加载到MemoryStream
中,然后使用StreamReader
对其进行迭代。MemoryStream
明确支持内存流上的位置重置。
String data = "Hello! My name it Inigo Montoya.";
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(data)))
{
using (StreamReader reader = new StreamReader(stream))
{
// Do your parsing here using the standard StreamReader methods.
// They should be fairly comparable to StringReader.
// When all done, reset stream position to the beginning.
stream.Seek(0, SeekOrigin.Begin);
}
}
StringReader用私有int
字段_pos
跟踪它在字符串中的位置,如果你想重置它,你可以使用一个简单的扩展方法,像这样:
public static void Reset(this StringReader reader)
{
reader.GetType()
.GetField("_pos", BindingFlags.NonPublic | BindingFlags.Instance)
.SetValue(reader, 0);
}
和一个测试方法:
[Test]
public void Reset()
{
const string random = "this is a test string";
using(var reader = new StringReader(random))
{
Assert.AreEqual(random, reader.ReadToEnd());
Assert.IsEmpty(reader.ReadToEnd());
reader.Reset();
Assert.AreEqual(random, reader.ReadToEnd());
Assert.IsEmpty(reader.ReadToEnd());
}
}
你可以为StreamReader使用扩展方法并自己处理它:
public static class SRExtentions
{
public static void ResetToBeginning(this StringReader reader)
{
SetPrivateField(reader, "_pos", 0);
}
private static void SetPrivateField(this object obj, string name, object value)
{
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
Type type = obj.GetType();
FieldInfo field = type.GetField(name, flags);
field.SetValue(obj, value);
}
}
参见类似问题:如何重置c# .NET TextReader光标回到起始点?
但正如Matthew所说,解决方案可能是简单地创建一个新的