如何重置位置在StringReader字符串的开始

本文关键字:字符串 开始 StringReader 何重置 位置 | 更新日期: 2023-09-27 18:06:50

我有以下代码:

StringReader contentReader = new StringReader(this.dataContent.ToString());

在我解析我的datcontent之后,我需要将contentReader的毒害重置为字符串的开头。我该怎么做呢?我在StringReader

如何重置位置在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所说,解决方案可能是简单地创建一个新的