Относительно членов C # Static Readonly - PullRequest
2 голосов
/ 26 января 2010

У меня следующая ситуация. В моем приложении есть очень распространенный класс, который содержит статическое поле только для чтения, которое называется «BinDirectory» и содержит путь к каталогу bin. Другие поля этого класса, которые также являются статическими только для чтения, используют это значение в качестве основы для своего значения. В текущей версии BinDirectory инициализируется для хранения каталога, в котором выполняется код (то есть Assembly.GetExecutingAssembly (). CodeBase). Я хочу расширить этот класс, чтобы инициализировать BinDirectory для хранения «TargetDir» из контекста установщика, когда он запускается из установщика моего приложения. Я могу изменить BinDirectory, чтобы он был просто статическим, но я не хочу этого делать, так как он заставит меня сделать много изменений в классе, который часто встречается в моем приложении. Может кто-нибудь предложить элегантное решение этой проблемы?

Ответы [ 3 ]

5 голосов
/ 26 января 2010

Сделайте это свойство только с помощью метода доступа get:

public static string BinDirectory
{
    get { return _initialisedBinDirectory; }
}

Затем в коде статического конструктора инициализируйте личную переменную, как вам нужно.

EDIT

Задержка загрузки (согласно комментарию):

public static string BinDirectory
{
    get
    {
        if (_initialisedBinDirectory == null)
            // load the variable when needed
        else
            return _initialisedBinDirectory;
    }
}

Таким образом, вы загружаете переменную только тогда, когда вам это нужно, и она используется повторно всякий раз, когда вы вызываете ее снова. Надеюсь, вы не классифицируете null как допустимое значение для него.

3 голосов
/ 26 января 2010

Это то, для чего нужны AppConfigs. В разделе AppSettings добавьте новый ключ с именем BinDirectory. Вы можете переписать свой класс как:

public static string BinDirectory
{
    get
    {
        return ConfigurationManager.AppSettings["BinDirectory"];
    }
}

Наконец, как один из последних шагов в процессе установки, вы можете изменить BinDirectory, чтобы он указывал на любой каталог, который вы хотите. Так что теперь это значение полностью определяется контекстом установщика.

0 голосов
/ 26 января 2010

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

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

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

Например:

public class Values { 
  public static string BinDir;
  public static string OtherDir { 
    get { return Path.Combine(BinDir,@"Some\Other\Path"); } 
  }
}
...