Отражение в C # для изменения частного константного поля в классе - PullRequest
5 голосов
/ 02 января 2011

У меня есть следующий класс:

class RuleParser
{
   private const String FILE = "./rules/DetectionStrategies.xml";
   .
   .
   .
}

Теперь в моем тестовом проекте я хочу установить для константы FILE другое значение. Как мне добиться этого с помощью Reflection?

Ответы [ 4 ]

8 голосов
/ 02 января 2011

Вы попали в ловушку ...

const != readonly

Если бы это было только для чтения, вы могли бы сделать это, но const означает константу времени компиляции , которую компиляторы в свою очередь встраивают в результирующую программу. Следовательно, то, что вы делаете, никак не повлияет на любую программу, вашу или чужую.

3 голосов
/ 02 января 2011

Добавьте это в ваш конфигурационный файл:

<appSettings>
    <add key="DetectionStrategies" value="./rules/DetectionStrategies.xml" />
</appSettings>

Но я бы хотел использовать его как свойство с приватным сеттером, например:

class RuleParser
{
    private string _file = string.Empty;
    private string File 
    {
        get 
        {
            if(string.IsNullOrEmpty(_file))
                _file = ConfigurationManager.AppSettings["DetectionStrategies"];
            return _file;
        }
        private set;
    }
}

.System.Configuration.

РЕДАКТИРОВАТЬ: Так как она должна быть постоянной времени компиляции, когда вы присваиваете значения const, я удалила это и сохранила «свойство» только срешение частного набора.

РЕДАКТИРОВАНИЕ 2: Важной частью этого является то, что вы должны использовать const только для истинных констант, настраиваемые значения должны быть конфигурируемыми, и хорошее место для этогоКонфигурационный файлХотя вам не нужно использовать файл конфигурации, вы также можете написать свой собственный класс конфигурации, который будет использоваться вместо базы данных или базы данных с резервным файлом конфигурации.Я мог бы подумать, что вы хотите использовать static переменную, а не const, но это зависит от того, как вы используете переменную и в каком контексте.

0 голосов
/ 02 января 2011

Вместо того, чтобы пытаться изменить const во время выполнения (или readonly или что-то еще), я бы посоветовал вам внести некоторые изменения в дизайн, чтобы улучшить тестируемость вашего кода.

Вот несколько простых примеров:

  1. Переместите значение в App.Config, чтобы у теста могли быть разные значения.
  2. Абстрагируйте путь к файлу от класса RuleParser, указав егов конструкторе.Либо указав сам путь, либо предоставив некоторый интерфейс (например, IFileParserConfig), который предоставит значение во время выполнения.
0 голосов
/ 02 января 2011

Черт возьми, ты знаешь, что означает постоянная?Вы не можете это изменить.Я думаю, что компиляторы даже не компилируют ссылки на константы, они просто компилируют фактическое значение, поэтому они даже не заметят, изменилось ли значение на самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...