C# - 在自定义控制台扩展方法中使用常规 Console.WriteLine 格式?

Posted

技术标签:

【中文标题】C# - 在自定义控制台扩展方法中使用常规 Console.WriteLine 格式?【英文标题】:C# - Using regular Console.WriteLine formatting in a custom console extension method? 【发布时间】:2017-04-30 21:41:27 【问题描述】:

我目前正在编写一个小型控制台游戏,并创建了一个自定义类 Xconsole,该类具有在控制台的特定区域显示文本以及为游戏消息提供“滚动效果”的方法。

public static int CurrentConsoleLine = 46;
public static List<String> XconsoleBuffer = new List<String>();

public static void MessageToConsole(string message)

    if (CurrentConsoleLine >= 59)
    
        XconsoleBuffer.RemoveAt(12);
        XconsoleBuffer.Insert(0, message);
        ClearMessageBox();

        for (int i = 0; i < XconsoleBuffer.Count; i++)
        
            Console.SetCursorPosition(0, (46 + i));
            Console.WriteLine(XconsoleBuffer[i]);
        
    
    else
    
        Console.SetCursorPosition(0, CurrentConsoleLine);
        Console.WriteLine(message);
        XconsoleBuffer.Add(message);
        CurrentConsoleLine++;
    

但是,由于要写入的文本在函数中作为参数传递,我注意到我不能使用 Console.WriteLine 通常提供的格式化选项,虽然这确实有效:

Xconsole.MessageToConsole(Name + " hits the " + monster.Name + " for " + damage + " damage. " + monster.Name + " now has " + monster.CurrentHp + " hp remaining.");

我宁愿这样写,这样字符串更容易阅读

Xconsole.MessageToConsole("0 hits the 1 for 2 damage. 1 now has 3 hp remaining", Name, monster.Name, damage, monster.CurrentHp);

有什么方法可以修改 MessageToConsole 方法,以便能够替换 Console.WriteLine 或使用格式化选项来调用已经存在的 WriteLine?

提前感谢您的回答,希望这次我没有放太多信息。

另外,我知道代码现在有点像 hack-ish,所以如果你有想法替换整个代码,请随时分享。我仍在学习,因此感谢您的评论。

【问题讨论】:

public void MessageToConsole(string format, params object[] args) ... Console.WriteLine(format, args); ... 不会吗? 【参考方案1】:

您可以使用 params 关键字简单地使用参数变量重载您的函数:

public static void MessageToConsole(string format, params object[] args) 

    MessageToConsole(String.Format(format, args));

这将允许您像使用 String.Format(format, args[]) 一样调用带有参数的方法:

Xconsole.MessageToConsole("0 hits the 1 for 2 damage. 1 now has 3 hp remaining", Name, monster.Name, damage, monster.CurrentHp);

【讨论】:

除了我的解决方案之外,这是更多 oop 方法和 c# 版本 = 6,我的解决方案可以为您节省大量编码时间。 @MartinGodzina 您的解决方案也可以,但是您真的认为编写单行重载是“大量编码时间”吗? 在我看来,它不必要的样板代码(顺便说一下我数了 4 行),但如果您使用 c# 版本 >= 6,则没有正确的解决方案。所以这更像是一场代码设计辩论。而且您需要更多代码来调用该方法。 :)【参考方案2】:

您可以简单地使用 c#6 中广泛使用的字符串插值

Xconsole.MessageToConsole($"Name hits the monster.Name for damage damage. monster.Name now has monster.CurrentHp hp remaining");

只需在您的字符串前放一个美元符号并使用括号中的变量名。

您可以阅读有关字符串插值的更多信息here。

【讨论】:

非常感谢!这太棒了,甚至比在字符串中间放一堆 # 更好。

以上是关于C# - 在自定义控制台扩展方法中使用常规 Console.WriteLine 格式?的主要内容,如果未能解决你的问题,请参考以下文章

在自定义数字键盘上的按键上点击播放声音

无法在自定义配置文件提供程序中加载类型

UIScreenEdgePanGestureRecognizer 在自定义键盘扩展中不起作用

在自定义键盘扩展中检测输入对象视图类型

C#:在自定义消息框中显示进度条变化

您的:需要在自定义短网址中扩展字符