【问题标题】:Inheriting from StreamWriter with smallest possible effort以最小的努力从 StreamWriter 继承
【发布时间】:2023-08-10 10:00:02
【问题描述】:

我正在使用允许使用 StreamWriter 进行日志记录的外部库 - 现在我想根据日志记录的内容添加一些处理。由于我想避免遍历日志文件,我想编写一个继承自 StreamWriter 的类。
用最少的方法/构造函数重新实现从 StreamWriter 继承的最佳方式是什么?

【问题讨论】:

  • 您希望在派生类中更改 StreamWriter 的什么行为?
  • 不幸的是,我不确定调用了哪个实际的 write 实现 - 我的猜测只是 Write(string)。我想基本上将所有内容保留在文件中,但添加一些处理以检查记录的内容是否包含 x.我更喜欢这个而不是编写一个定期读取日志的单独程序,因为它会更高效。
  • 然后,使用我的答案,但覆盖所有 Write 方法并放置断点以查看在您的特定场景中调用的内容。
  • 把它们都包起来找出来......
  • 这次是 7 秒。我想这个问题只有一个答案。 ;-)

标签: c# mocking streamwriter


【解决方案1】:

我不确定您到底想做什么,但如果您只想检查流中写入的内容,您可以这样做:

public class CustomStreamWriter : StreamWriter
{
    public CustomStreamWriter(Stream stream)
        : base(stream)
    {}

    public override void Write(string value)
    {
        //Inspect the value and do something

        base.Write(value);
    }
}

【讨论】:

  • 只希望你只需要覆盖 Write(char) 因为所有其他对 Write 的调用都到了那里,比覆盖每个 write 方法的工作量更少。如果你在另一个方法上调用 base.Write(),你最终可能会多次写入相同的数据(例如:调用 write(string) 的基本调用 write(char))
【解决方案2】:

确定外部库使用的构造函数并实现(或全部实现),然后您只需要覆盖外部库使用的写入方法。

public class Class1 : StreamWriter 
{
    public Class1(Stream stream)
        : base(stream)
    {

    }
    public Class1(Stream stream, Encoding encoding)
        : base(stream, encoding)
    {

    }
    public Class1(Stream stream, Encoding encoding, int bufferSize)
        : base(stream, encoding, bufferSize)
    {

    }
    public Class1(string path)
        : base(path)
    {

    }
    public Class1(string path, bool append)
        : base(path, append)
    {

    }
    public Class1(string path, bool append, Encoding encoding)
        : base(path, append, encoding)
    {

    }
    public Class1(string path, bool append, Encoding encoding, int bufferSize)
        : base(path, append, encoding, bufferSize)
    {

    }

    public override void Write(string value)
    {
        base.Write(value);
    }
}

【讨论】:

    最近更新 更多