有条件地设置装配级别属性

时间:2013-02-11 11:08:00

标签: c# .net attributes assemblies

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

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

我还有其他选择吗?

更新

我的目标:我想做什么

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

2 个答案:

答案 0 :(得分:2)

我认为这不仅仅是回答: 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

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

答案 1 :(得分:0)

尝试使用

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

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