所以我有许多不同的潜在对象可以输出数据(字符串)。我想要做的是运行一个通用的 Output.WriteLine 函数,其潜在参数定义了您希望将其输出到的位置。我有什么代码 -
//Defined in static class Const
public enum Out : int { Debug = 0x01, Main = 0x02, Code = 0x04 };
static class Output
{
private static List<object> RetrieveOutputMechanisms(Const.Out output)
{
List<object> result = new List<object>();
#if DEBUG
if (bitmask(output, Const.Out.Debug))
result.Add(1);//Console); //I want to add Console here, but its static
#endif
if (bitmask(output, Const.Out.Main))
if (Program.mainForm != null)
result.Add(Program.mainForm.Box);
if (bitmask(output, Const.Out.Code))
if (Program.code!= null)
result.Add(Program.code.Box);
return result;
}
public static void WriteLine(Color color, string str, Const.Out output = Const.Out.Debug & Const.Out.Main)
{
Console.WriteLine(
List<object> writers = RetrieveOutputMechanisms(output);
foreach (object writer in writers)
writer.WriteLine(str, color);
}
}
重点在于,输出目的地并不总是存在,因为它们在调用这些调用时可能存在也可能不存在的表单上。所以想法是确定您要打印到哪些,确定它是否存在,将其添加到要打印到的事物列表中,然后循环并打印到所有这些,如果它们实现了“WriteLine”方法.
我遇到的两个问题是
- 该控制台是一个静态类,不能正确(据我所知)添加到对象列表中。
我不知道如何断言列表中的对象定义了 WriteLine,并将它们转换为适用于多个基本类型的东西。假设我可以让控制台在这个方案中正常工作,这将是一个明显的问题,它的基本类型与实际的盒子不同,而且,如果我有一些不是盒子的东西,那么做起来会很可爱就像是
foreach(作家中的对象作家).WriteLine(str,color)
这样我就不必单独投射它们了。
我不简单地从 RetrieveOutputMechanisms 函数中写入 WriteLine 的更大原因是,我希望它不仅仅涵盖 WriteLine,这意味着我需要将位掩码代码复制到每个函数。
编辑:我意识到将公共属性添加到 Program 是一个坏主意,如果你知道我可以如何避免它(必要性来自需要能够从任何地方访问任何来来去去的 WriteLine 表单对象),通过一切手段请详细说明。