我想根据从我的配置文件中读取的值有条件地设置程序集级别属性。是否可以?
我读到属性是静态元数据,因此虽然数据本身可以在运行时更改,但在应用程序启动后更改不适用。
我还有什么其他选择?
更新
我的目标:我想要做什么
我正在使用 TraceAttribute 来跟踪所有方法的入口和出口点。我想根据配置文件中的值在程序集级别打开或关闭此属性。我想在大多数时候关闭它,但只在紧急情况下打开它以从特定环境收集问题的证据。
我想根据从我的配置文件中读取的值有条件地设置程序集级别属性。是否可以?
我读到属性是静态元数据,因此虽然数据本身可以在运行时更改,但在应用程序启动后更改不适用。
我还有什么其他选择?
更新
我的目标:我想要做什么
我正在使用 TraceAttribute 来跟踪所有方法的入口和出口点。我想根据配置文件中的值在程序集级别打开或关闭此属性。我想在大多数时候关闭它,但只在紧急情况下打开它以从特定环境收集问题的证据。
我认为这里的答案不止于此: Can attributes are be added dynamic in C#?
我仍然不确定为什么需要绑定程序集级属性和配置键,但是您可以将配置键传递给属性的构造函数/属性并在属性逻辑中解析其值。它看起来像:
[AttributeUsage(AttributeTargets.Assembly)]
public class TraceAttribute : Attribute
{
public TraceAttribute(string traceConfigKey)
{
var keyValue = ConfigurationManager.AppSettings[traceConfigKey];
DoTracing = !string.IsNullOrEmpty(keyValue) && bool.Parse(keyValue);
}
/// <summary>
/// Use this property for your tracing conditional logic.
/// </summary>
public bool DoTracing { get; private set; }
}
然后在您的 AssemblyInfo 中:
[assembly: Trace("DoTracing")]
和配置文件:
<appSettings>
<add key="DoTracing" value="true"/>
</appSettings>
作为另一种解决方案,如果您使用现有属性,并且无法自定义它,您还可以在项目属性中添加条件编译符号,然后编写:
#if TRACE
[assembly: Trace()]
#endif
但它当然需要重新编译项目。
尝试使用
#ifdef TRACE
[TraceAttribute()]
#endif
MethodBeingTraced()
{
}
在项目配置级别定义 TRACE 变量