2013-09-04 6 views
4

У меня есть фрагмент C# код, который выглядит следующим образом:Использование параметров конфигурации в атрибутах

[OracleCustomTypeMapping(Constants.DBSchema + ".TAB_VARCHAR2_250")] 
public class StringTableFactory : TableFactoryTemplate<StringTable> 
{ 
    public override System.Array CreateStatusArray(int length) 
    { 
     return new OracleUdtStatus[length]; 
    } 
} 

Есть ли способ, чтобы изменить объявление атрибута, так Constants.DBSchema считываются из web.config вместо того, он жестко закодирован как константа в коде? Если я поместил ConfigurationManager.appSettings в объявление атрибута, я получаю ошибку «Аргумент атрибута должен быть константным выражением ...».

Спасибо.

+0

атрибутов аргументы должны быть во время компиляции константы, параметры конфигурации, очевидно, не являются. Лучшее, что вы могли бы надеяться на использование чего-то, что является обертыванием значений конфигурации, - это поле «static readonly», которое является постоянной времени выполнения (внутри AppDomain), но не во время компиляции. –

+0

Сообщение об ошибке объясняет все это. Атрибуты должны быть константами времени компиляции. Очевидно, что настроек конфигурации нет. –

ответ

8

Вместо того чтобы передавать его как часть аргументов конструктора, прочитайте его непосредственно из ConfigurationManager в конструкторе атрибута.

public class OracleCustomTypeMappingAttribute : Attribute 
{ 
    public OracleCustomTypeMappingAttribute(string typeName) 
    { 
     var schema = ConfigurationManager.AppSettings["Schema"]; 
     TypeMapping = schema + "." + typeName; 
     // Or whatever property needs to be set 
    } 
} 

Тогда вы бы просто сделать:

[OracleCustomTypeMapping("TAB_VARCHAR2_250")] 
public class StringTableFactory : TableFactoryTemplate<StringTable> 
{ 
    public override System.Array CreateStatusArray(int length) 
    { 
     return new OracleUdtStatus[length]; 
    } 
}