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

时间:2014-07-21 08:46:23

标签: c# filestream

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 方法,这样如果stream是控制台流,则输出显示在控制台上,如果流是文件流,则输出将写入文件中。

以下是我实现它的方式:

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);
    }
}

我在我的派生类中使用了上述方法并进行了一些修改。还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

你应该可以用{:}替换整个Details。{/ p>

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

根据您是否希望在将details字符串写入后继续使用传递的流,您可能还想添加命令:

    sw.Close();

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

另请注意,当您将Environment.NewLine添加到details字符串时,您应该依赖于流自己的换行符,该换行符可能与环境字符不同。如果你真的想要两个换行符,你应该拨打两个WriteLine来电,如上例所示。

答案 1 :(得分:1)

这似乎非常错误。

如果要写入控制台,只需将Details()Console.Out返回的流传递给Details(),然后始终在myCar.Details(Console.Out); 的实现中写入流。< / p>

所以你可以这样称呼它:

{{1}}