C# 是否可能重载Console.ReadLine?(或任何静态类方法)

C# 是否可能重载Console.ReadLine?(或任何静态类方法),c#,class,static,console,overloading,C#,Class,Static,Console,Overloading,我试图创建一个重载的System.Console.ReadLine()方法,该方法将接受一个字符串参数。我的目的基本上是能够写作 string s = Console.ReadLine("Please enter a number: "); 代替 Console.Write("Please enter a number: "); string s = Console.ReadLine(); 我认为不可能重载Console.ReadLine本身,所以我尝试实现一个继承类,如下所示: publi

我试图创建一个重载的
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
继承(因为它是一个静态类,会自动使其成为密封类)


我在这里做的有意义吗?或者,想要从静态类重载某些内容从来都不是一个好主意吗?

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

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
实现驱动程序,因此命令可以来自文件而不是控制台,这可以提供一些很好的自动化场景

更新
您需要公开的大多数方法都非常简单。好吧,也许写起来有点乏味,但它不需要很多分钟的工作,而且你只需要写一次

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


您是否可以创建自己的仅在控制台上工作的静态类?如果这样做,我必须记住对
ReadlLine()
使用
MyConsole
,但对任何其他控制台方法使用
Console
。如果可以继承,我可以使用
MyConsole.WriteLine()
MyConsole.Clear()
或任何其他
控制台
方法。@comecme:想法是让
MyConsole
包装所有需要使用的方法(通常不太多)。您可以在自己的类中包装控制台的每个方法,并实现相同的净效果。@Fredrik:如果我想将
Write
WriteLine
方法包装到MyConsole中,我必须包装我想使用的每个Write和WriteLine重载,对吗?所以,也许方法不是那么多,但有很多重载。@comecme:事实上更容易;您要使用的大多数方法都直接映射到在底层
TextWriter
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);
}