在一個類中,我有一個跟蹤方法,看起來像這樣:System.Diagnostics.ConditionalAttribute和有條件編譯配套類型和變量
[System.Diagnostics.ConditionalAttribute("Trace")]
private void TraceOutput(TraceBits bits, string format, params object[] varParams)
{
if ((bits & _DesiredTrace) != 0)
{
...emit trace here...
}
}
TraceBits是[Flags] enum
。每個對TraceOutput的調用都會傳入該呼叫標記的位。就像這樣:
TraceOutput(TraceBits.Fill,
"Fill lock wi({0}) stat({1}) iba({2}) nf({3})",
workitem.index,
workitem.status,
workitem.inputBytesAvailable,
_nextToFill
);
該位是:創建,讀取,寫入,填充等_DesiredTrace是(私有成員變量)位域指示跟蹤語句應該實際發射。通過這種方式,我可以有選擇地爲類中的各個函數部分打開跟蹤語句。如果我只想跟蹤構造和破壞,則在該成員位域中設置創建位。
我可以在該方法上使用ConditionalAttribute
,但該屬性不適用於成員變量或嵌套類型(如TraceBits)。
因此,支持跟蹤的類型和變量會被編譯到代碼中,無論是否定義了Trace
。如果Trace未定義,那麼這些都是不必要的。
有沒有一種乾淨的方式來有條件地編譯支持類型和變量?
我知道我可以使用#if Trace ... #endif
來包圍聲明和TraceOutput的所有調用,以及所有支持的東西,但是代碼很醜。我喜歡ConditionalAttribute
的清潔外觀,每個對TraceOutput的調用都不需要用#if Trace
括起來。
我真正想要的是在嵌套類和成員變量上使用該屬性或類似的東西。那可能嗎?