根据用户选择将流写入控制台或文件

本文关键字:控制台 文件 用户 选择 | 更新日期: 2023-09-27 18:14:05

abstract class Car
{
    string Name;
    //some other fields
    abstract public void Details(Stream stream);
}
class Maruti : Car
{
    int x;
    //some other fields
    public override void Details(Stream stream)
    {
         // to do
    }
}
class Mercedes : Car
{
    int y;
    //some other fields
    public override void Details(Stream stream)
    {
         // to do
    }
}

我必须编写Details方法,这样如果流是控制台流,则输出显示在控制台,如果流是文件流,则输出写入文件。

我是这样做到的:

public override void Details(Stream stream)
{
    string details = "Name : " + this.Name + Environment.NewLine ;
    if (stream is FileStream)
    {
        TextWriter tmp = Console.Out;
        StreamWriter sw2 = new StreamWriter(stream);
        Console.SetOut(sw2);
        Console.WriteLine(details);
        Console.SetOut(tmp);
        sw2.Close();
    }
    else
    {
        Console.WriteLine(details);
    }
}

我在我的两个派生类中使用了上面的方法,并做了一些修改。有更好的办法吗?

根据用户选择将流写入控制台或文件

您应该能够将Details的整个主体替换为:

    string details = "Name : " + this.Name;
    StreamWriter sw = new StreamWriter(stream);
    sw.WriteLine(details);
    sw.WriteLine();

根据您是否希望在写入details字符串后进一步使用传递的流,您可能还需要添加命令:

    sw.Close();

说明:StreamWriter来源于TextWriterConsole.Out的类型为TextWriter。因此,您不必将控制台输出替换为您的临时流写入器,而是可以直接使用它来编写您的内容。

还请注意,当您将Environment.NewLine添加到details字符串时,您应该依赖于流自己的换行符,该换行符可能与环境中的换行符不同。如果你真的想要两个换行符,你应该像我上面的例子一样调用WriteLine

这看起来很不对。

如果你想写入控制台,你应该把从Console.Out返回的流传递给Details(),然后在Details()的实现中总是写入流。

你可以这样命名它:

myCar.Details(Console.Out);