C# System.Diagnostics.ConditionalAttribute和有条件编译支持类型和变量
在一个类中,我有一个跟踪方法,如下所示:C# System.Diagnostics.ConditionalAttribute和有条件编译支持类型和变量,c#,C#,在一个类中,我有一个跟踪方法,如下所示: [System.Diagnostics.ConditionalAttribute("Trace")] private void TraceOutput(TraceBits bits, string format, params object[] varParams) { if ((bits & _DesiredTrace) != 0) { ...emit trace h
[System.Diagnostics.ConditionalAttribute("Trace")]
private void TraceOutput(TraceBits bits, string format, params object[] varParams)
{
if ((bits & _DesiredTrace) != 0)
{
...emit trace here...
}
}
TraceOutput(TraceBits.Fill,
"Fill lock wi({0}) stat({1}) iba({2}) nf({3})",
workitem.index,
workitem.status,
workitem.inputBytesAvailable,
_nextToFill
);
TraceBits是一个[Flags]枚举
。对TraceOutput的每次调用都会传入调用标记的位。像这样:
[System.Diagnostics.ConditionalAttribute("Trace")]
private void TraceOutput(TraceBits bits, string format, params object[] varParams)
{
if ((bits & _DesiredTrace) != 0)
{
...emit trace here...
}
}
TraceOutput(TraceBits.Fill,
"Fill lock wi({0}) stat({1}) iba({2}) nf({3})",
workitem.index,
workitem.status,
workitem.inputBytesAvailable,
_nextToFill
);
位包括:创建、读取、写入、填充等。\u DesiredTrace是一个(私有成员变量)位字段,指示应实际发出哪些跟踪语句。通过这种方式,我可以有选择地为类中函数的各个部分打开跟踪语句。如果我只想跟踪构造和破坏,我在该成员位字段中设置Create位
我可以在方法上使用ConditionalAttribute
,但该属性在成员变量或嵌套类型(如TraceBits)上不起作用
因此,无论是否定义了Trace
,支持跟踪的类型和变量都会被编译到代码中。如果跟踪未定义,则这些是完全不必要的
是否有一种干净的方法可以有条件地编译中的支持类型和变量
我知道我可以使用#如果跟踪#endif
来包围TraceOutput的声明和所有调用,以及所有支持的东西,但这会使代码变得丑陋。我喜欢条件属性
的简洁外观,其中对TraceOutput的每个调用不需要用#if Trace
括起来
我真正想要的是在嵌套类和成员变量上使用该属性或类似属性的方法。可能吗 Re枚举;关于
[条件]
的一点是,是否实际执行调用取决于调用方的构建—始终包括声明/实现代码;因此,假设您的代码是一个独立的库;必须包含枚举,否则调用方(假设调用方是独立的)无法调用该方法
这听起来像是#如果更适合您的问题-或者您可以在构建中使用条件包含(csproj支持这一点,尽管它可能会引起混淆;#如果更明显)
请注意,要执行重载解析,它必须首先识别类型,因此不能将#if
与[条件]
混合使用,因为枚举位于签名中