【问题标题】:Set assembly level attribute conditionally有条件地设置装配级属性
【发布时间】:2013-02-11 11:07:59
【问题描述】:

我想根据从我的配置文件中读取的值有条件地设置程序集级别属性。有可能吗?

我读到属性是静态元数据,因此虽然数据本身可以在运行时更改,但更改在应用程序启动后不适用。

我还有什么其他选择?

更新

我的目标:我想要做什么

我正在使用 TraceAttribute 来跟踪所有方法的入口和出口点。我想根据配置文件中的值在程序集级别打开或关闭此属性。我想在大多数情况下关闭它,但只在紧急情况下打开它以收集来自特定环境的问题证据。

【问题讨论】:

  • 请解释为什么要根据一些配置值设置属性。你想达到什么目标?
  • 我已更新我的问题以按目标包含。

标签: c# .net attributes assemblies


【解决方案1】:

我认为这里的答案不止于此: Can attributes be added dynamically 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

但它当然需要重新编译项目。

【讨论】:

  • 太棒了!现在,我为什么没有想到这一点。
【解决方案2】:

尝试使用

#ifdef TRACE
[TraceAttribute()]
#endif
MethodBeingTraced()
{
}

在项目配置级别定义 TRACE 变量

【讨论】:

    猜你喜欢
    • 2017-05-28
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2019-08-19
    • 1970-01-01
    • 2015-03-01
    • 2018-04-19
    相关资源
    最近更新 更多