したがって、データ(文字列)を出力できるさまざまな潜在的なオブジェクトがいくつかあります。私ができるようにしたいのは、出力先を定義する潜在的な引数を使用して、汎用の 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」メソッドを実装している場合はループしてすべてに印刷することです.
私が遭遇した2つの問題は、
- そのコンソールは静的クラスであり、(私の知る限り) オブジェクト リストに適切に追加することはできません。
リスト内のオブジェクトが WriteLine を定義していると主張し、それらを複数の基本型に適用されるものにキャストする方法がわかりません。このスキームでコンソールを適切に動作させることができると仮定すると、それは明らかな問題であり、実際のボックスと同じ基本タイプではありませんが、ボックスではないものがあれば、それは素晴らしいことです何かのようなもの
foreach (ライターのオブジェクトライター) .WriteLine(str, color)
個別にキャストする必要がないように。
RetrieveOutputMechanisms 関数から単純に WriteLine を実行しない大きな理由は、WriteLine だけでなく、それ以上のものをカバーする必要があるためです。つまり、各関数にビットマスク コードをコピーする必要があります。
編集: パブリック プロパティを Program に追加するのは悪い考えだと思います.ぜひ詳しく教えてください。