重载 Console.ReadLine 可能吗? (或任何静态类方法)

Posted

技术标签:

【中文标题】重载 Console.ReadLine 可能吗? (或任何静态类方法)【英文标题】:Overloading Console.ReadLine possible? (or any static class method) 【发布时间】:2011-05-29 07:39:09 【问题描述】:

我正在尝试创建将采用字符串参数的System.Console.ReadLine() 方法的重载。我的目的基本上是能够写作

string s = Console.ReadLine("Please enter a number: ");

代替

Console.Write("Please enter a number: ");
string s = Console.ReadLine();

我认为不可能重载Console.ReadLine 本身,所以我尝试实现一个继承类,如下所示:

public static class MyConsole : System.Console

    public static string ReadLine(string s)
    
        Write(s);
        return ReadLine();
    

但这不起作用,因为它不可能从System.Console 继承(因为它是一个静态类,它会自动成为一个密封类)。

我在这里尝试做的事情有意义吗?或者从静态类中重载某些东西永远不是一个好主意?

【问题讨论】:

你不能只创建自己的静态类,只在控制台上工作吗? 【参考方案1】:

只需将控制台包装在您自己的类中并使用它即可。您不需要为此继承:

class MyConsole

    public static string ReadLine()
    
        return System.Console.ReadLine();
    
    public static string ReadLine(string message)
    
        System.Console.WriteLine(message);
        return ReadLine();
    
    // add whatever other methods you need

然后你可以继续在你的程序中使用它:

string whatEver = MyConsole.ReadLine("Type something useful:");

如果您希望进一步推动它并使MyConsole 更灵活一点,您还可以添加支持以替换输入/输出实现:

class MyConsole

    private static TextReader reader = System.Console.In;
    private static TextWriter writer = System.Console.Out;

    public static void SetReader(TextReader reader)
    
        if (reader == null)
        
            throw new ArgumentNullException("reader");
        
        MyConsole.reader = reader;
    

    public static void SetWriter(TextWriter writer)
    
        if (writer == null)
        
            throw new ArgumentNullException("writer");
        
        MyConsole.writer = writer;
    


    public static string ReadLine()
    
        return reader.ReadLine();
    
    public static string ReadLine(string message)
    

        writer.WriteLine(message);
        return ReadLine();
    
    // and so on

这将允许您从任何TextReader 实现驱动程序,因此命令可以来自文件而不是控制台,这可以提供一些不错的自动化场景...

更新 您需要公开的大多数方法都非常简单。好吧,写起来可能有点乏味,但工作时间不长,你只需要写一次。

示例(假设我们在上面的第二个示例中,具有可分配的读取器和写入器):

public static void WriteLine()

    writer.WriteLine();


public static void WriteLine(string text)

    writer.WriteLine(text);


public static void WriteLine(string format, params object args)

    writer.WriteLine(format, args);

【讨论】:

如果我这样做,我必须记住将MyConsole 用于ReadlLine(),但将Console 用于任何其他控制台方法。如果可以继承,我可以使用MyConsole.WriteLine()MyConsole.Clear() 或任何其他Console 方法。 @comecme:我们的想法是让MyConsole 包装您需要使用的所有方法(通常没有那么多)。 你可以将Console的每一个方法封装在你自己的类中,达到同样的效果。 @Fredrik:如果我想将WriteWriteLine 方法包装到MyConsole 中,我必须包装我想使用的Write 和WriteLine 的每个重载,对吗?所以可能方法不是很多,但是重载很多。 @comecme:实际上更容易;您要使用的大多数方法直接映射到调用底层TextWriterTextReader 上的相应方法,因此在大多数情况下您可以直接传播调用而无需任何进一步处理(将添加示例)。跨度>

以上是关于重载 Console.ReadLine 可能吗? (或任何静态类方法)的主要内容,如果未能解决你的问题,请参考以下文章

Console.Read() 和 Console.ReadLine() 之间的区别?

判断某年某月有几天

Console.ReadLine(); 获取用户输入内容

C# Console.Read();和Console.ReadLine();和Console.ReadKey();区别详解。

相当于 c++ 中的 Console.ReadLine()

如何向 Console.ReadLine() 添加超时?