2013-02-11 1 views
1

Я хотел бы установить атрибут уровня сборки условно на основе значения, считанного из моего файла конфигурации. Является ли это возможным?Установить атрибут уровня сборки условно

Я читал, что атрибуты являются статическими метаданными, поэтому, хотя сами данные могут быть изменены во время выполнения, изменения не имеют применения после запуска приложения.

Какие еще альтернативы у меня есть?

Update

Моя цель: То, что я пытаюсь сделать

Я использую TraceAttribute отслеживать все въездные метод и выхода. Я хотел бы включить или отключить этот атрибут на уровне сборки на основе значения из файла конфигурации. Я бы хотел, чтобы это было в большинстве случаев, но включите его в чрезвычайных ситуациях, чтобы собрать доказательства проблемы из определенной среды.

+0

Пожалуйста, объясните, почему вы хотите установить атрибут на основе некоторого значения конфигурации. Какую цель вы пытаетесь достичь? –

+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 

, но для этого требуется перекомпиляция проекта, конечно.

+0

Это здорово! Теперь, почему я не подумал об этом. –

0

Попробуйте использовать

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

определить переменную TRACE на уровне конфигурации проекта

 Смежные вопросы

  • Нет связанных вопросов^_^