所以我有許多不同的潛在對象可以輸出數據(字符串)。我想要做的就是運行一個通用的Output.WriteLine函數,並用可能的參數來定義輸出到哪裏。我有什麼碼 -C#如何判斷一個對象是否實現了一個特定的方法
//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,並將它們轉換爲適用於多個基類型的東西。假設我可以讓控制檯在這個方案中正常工作,這將是一個明顯的問題,它不是與實際的Boxes相同的基本類型,但是,如果我的東西不是Box,那麼這將是可愛的做像
的foreach(在作家的對象作家) .WriteLine(STR,顏色)
,這樣我就不必單獨投他們。
我不簡單WriteLine從RetrieveOutputMechanisms函數,更大的原因是我希望這不僅覆蓋WriteLine,這意味着我需要將位掩碼代碼複製到每個函數。
編輯:我意識到,將程序添加到公共屬性是一個壞主意,如果你知道如何避免它(必要性來自需要能夠訪問任何WriteLine能夠形式對象來去,從任何地方),請一定要詳細說明。
這看起來正是我想要的。一旦我測試,這將是答案。你知道一種方式,我可以在輸出類中「註冊」每個對象,因爲它們是被破壞的,並且註銷它們?現在他們是公開的,並且被認爲是程序的公共財產,對我來說這似乎非常黑客。 – DanielCardin
出於好奇,我爲什麼不能繼續使用靜態類?我想知道,因爲我對Singletons知之甚少,而且我只是編輯了你的代碼而不使用它們,至少編譯它。 – DanielCardin
它*看起來*工作得很好! (至少作爲一個靜態類,我沒有把所有的輸出替換成輸出。實例的) – DanielCardin