c# 我可以覆盖 .NET StreamWriter.WriteLine() 以返回它写的内容而不是 void 吗?

Kir*_*ace 0 .net c# oop overriding

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

我想重载 .NET 类方法本身,并覆盖该StreamWriter.WriteLine(string str, bool APPEND)方法以返回要求编写的任何内容而不是返回void.

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

取而代之的是:

Console.WriteLine(a + b + c + d + e);
sw.WriteLine(a + b + c + d + e);
Run Code Online (Sandbox Code Playgroud)

或这个:

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

Console.WriteLine(temp);
sw.WriteLine(temp);
Run Code Online (Sandbox Code Playgroud)

我反而想这样做:

Console.WriteLine(
    sw.WriteLine(a + b + c + d + e)
);
Run Code Online (Sandbox Code Playgroud)

为此,我需要 sw.WriteLine() 方法将其字符串参数作为返回值返回。

我了解覆盖方法所涉及的危险,但这是一个非常简单的单模块.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);
Run Code Online (Sandbox Code Playgroud)

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

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

我想做的事可以做吗?如果是这样,如何?

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

Dav*_*nce 5

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

public static class StreamWriterExtensions
{
    public static string WriteLine(this StreamWriter s, string value)
    {
        s.WriteLine(value);
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

不过就个人而言,我会坚持使用您的临时变量。如何使用它的意图是明确的。某些字符串变量赋值不应产生影响。

或者,如果变量赋值在代码的高层困扰你,你可以在方法中隐藏实现:

LogToStreamAndConsole(a + b + c);
LogToStreamAndConsole(d + e + f);
LogToStreamAndConsole(g + h + i);
Run Code Online (Sandbox Code Playgroud)

...它只是做这两个操作。

private void LogToStreamAndConsole(StreamWriter s, string value)
{
    s.WriteLine(value);
    Console.WriteLine(value);
}
Run Code Online (Sandbox Code Playgroud)