c# 我可以将 .NET StreamWriter.WriteLine() 重写为 return 它写的内容而不是 void 吗?

c# Can I override .NET StreamWriter.WriteLine() to return what it wrote instead of void?

我是一个精通但不是专家的OOP程序员。我知道 class 方法可以被覆盖以改变默认行为。

我想重载 .NET class 方法本身,并将 StreamWriter.WriteLine(string str, bool APPEND) 方法重写为 return 要求编​​写的任何内容而不是 returning void.

这是因为我必须登录到一个文件和控制台,而且我正在编写的字符串是一个复杂的表达式,我不想重复,也不想消耗额外的资源(并且添加额外的代码行)来创建一个行李变量,仅用于控制台和日志文件日志记录,在我写入控制台和日志文件的几十个地方中的每一个地方。

而不是这个:

Console.WriteLine(a + b + c + d + e);
sw.WriteLine(a + b + c + d + e);

或者这个:

string temp = a + b + c + d + e;

Console.WriteLine(temp);
sw.WriteLine(temp);

我想这样做:

Console.WriteLine(
    sw.WriteLine(a + b + c + d + e)
);

为此,我需要 sw.WriteLine() 方法 return 它的字符串参数作为 return 值。

我理解覆盖方法所涉及的危险,但这是一个非常简单的单模块 .cs 控制台应用程序,它只是搜索文本文件并向控制台和日志文件报告匹配行。

当我在 Visual Studio 中使用对象浏览器(查看定义)时,我看到:

public static void WriteLine(string format, object arg0);
public static void WriteLine(string format, params object[] arg);
public static void WriteLine(char[] buffer, int index, int count);
public static void WriteLine(decimal value);
public static void WriteLine(char[] buffer);
public static void WriteLine(char value);
public static void WriteLine(bool value);
public static void WriteLine(string format, object arg0, object arg1);
public static void WriteLine(double value);

第一个方法似乎具有我想要覆盖的签名。

但是所有这些方法都只有注释。没有代码。 (我的猜测,可能是因为它们是 .NET 内部 classes 编译成 .dll,没有分发代码)。

我想做的能做吗?如果是,怎么做?

如果没有,您能否建议另一种方法?

您不能覆盖它,但您可以为您想要的 WriteLine 的每个变体创建一个扩展方法,例如

public static class StreamWriterExtensions
{
    public static string WriteLine(this StreamWriter s, string value)
    {
        s.WriteLine(value);
        return value;
    }

    public static string WriteLineToStreamAndConsole(this StreamWriter s, string value)
    {
        s.WriteLine(value);
        Console.WriteLine(value);
        return value;
    }
}

然后像这样使用:

streamWriter.WriteLineToStreamAndConsole(a + b + c);

或者您可以在需要的地方用私有方法简单地完成。

private void WriteLineToStreamAndConsole(StreamWriter s, string value)
{
    s.WriteLine(value);
    Console.WriteLine(value);
}