これにより、登録方法 (コードまたは構成) に関係なく、すべてのトレース ソースが無効になります。
TraceSource を (コードまたは構成で) 作成すると、静的リストに追加されます。そのリストを取得するためのパブリック API はありません。しかし、その「プライベート」というキーワードは、私たちではなく、下位の開発者が従うべき兆候です。したがって、それをキックダウンして、当然のことながら私たちのものである変数への参照を取得しました。次に、リスナーを追加/削除し、トレース フラグをオフにします。トレースを無効にする方法は複数あります。
この例は単一のメソッドで機能しますが、この例のように TraceSource への参照がなくても、この手法は機能するはずです。
TraceSource source = new TraceSource("foo");
SourceSwitch onOff = new SourceSwitch("onOff", "Verbose");
onOff.Level = SourceLevels.Verbose;
ConsoleTraceListener console = new ConsoleTraceListener();
source.Switch = onOff;
bool alreadyDone = false;
foreach (var listener in source.Listeners)
{
if (typeof(ConsoleTraceListener) == listener.GetType())
{
alreadyDone = true;
}
}
if (!alreadyDone)
{
source.Listeners.Add(console);
}
source.TraceInformation("Hellow World! The trace is on!");
List<WeakReference> traceSources =
(List<WeakReference>)typeof(TraceSource)
.GetField("tracesources", BindingFlags.NonPublic | BindingFlags.Static)
.GetValue(source);
foreach (WeakReference weakReference in traceSources)
{
TraceSource target = (TraceSource)weakReference.Target;
source.TraceInformation(
"Somebody, in code or config, registered this trace source " + target.Name);
target.Listeners.Clear();
}
source.TraceInformation(
"Can you still see this? (No you can't, I cleared all the listeners)");