重载 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:如果我想将Write
和WriteLine
方法包装到MyConsole 中,我必须包装我想使用的Write 和WriteLine 的每个重载,对吗?所以可能方法不是很多,但是重载很多。
@comecme:实际上更容易;您要使用的大多数方法直接映射到调用底层TextWriter
或TextReader
上的相应方法,因此在大多数情况下您可以直接传播调用而无需任何进一步处理(将添加示例)。跨度>
以上是关于重载 Console.ReadLine 可能吗? (或任何静态类方法)的主要内容,如果未能解决你的问题,请参考以下文章
Console.Read() 和 Console.ReadLine() 之间的区别?
C# Console.Read();和Console.ReadLine();和Console.ReadKey();区别详解。