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 格式?的主要内容,如果未能解决你的问题,请参考以下文章