У меня есть следующая ситуация. В моем приложении есть очень распространенный класс, который содержит статическое поле readonly под названием «BinDirectory», которое содержит путь к каталогу bin. Другие поля этого класса, которые также являются статическими для чтения, используют это значение как базу для их значения. В текущей версии BinDirectory инициализируется для хранения каталога, в котором выполняется код (т. Е. Assembly.GetExecutingAssembly(). CodeBase). Я хочу расширить этот класс, чтобы инициализировать BinDirectory, чтобы удерживать «TargetDir» из контекста установщика, когда он запускается из моего установщика приложений. Я могу изменить BinDirectory просто статическим, но я не хочу, поскольку он заставит меня сделать много изменений в классе, который распространен в моем приложении. Может ли кто-нибудь предложить элегантное решение этой проблемы?Что касается C# Статические члены Readonly
ответ
Это то, что AppConfigs для. В разделе AppSettings добавьте новый ключ под названием BinDirectory
. Вы можете повторно написать свой класс, как:
public static string BinDirectory
{
get
{
return ConfigurationManager.AppSettings["BinDirectory"];
}
}
Наконец, в качестве одного из последних шагов в процессе установки, вы можете изменить BinDirectory, чтобы указать на любой каталог, который вы хотите. Итак, теперь это значение полностью определяется контекстом установщика.
Сделать это свойство только с «получить» аксессор:
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
действительным значением для него.
Это не сработает, так как статический конструктор будет работать, когда кто-то сначала начнет использовать мой класс, который может произойти до того, как я назову BinDirectory. – Ikaso
Я думал о решении для генерации кода или, может быть, другом элегантном стиле. – Ikaso
Я не понимаю вашего комментария о проблеме с этим подходом. –
Похоже, вы не можете изменять статическое поле readonly просто статическим, потому что это заставит вас изменить инициализацию всех других статических полей readonly в вашем классе.
Если это верно, к сожалению, вы не можете многое сделать, но потратьте время, чтобы внести изменения. Позволяя установить поле BinDirectory во время выполнения, вы принципиально меняете последовательность инициализации полей. Ваш код нужно будет адаптировать.
Я думаю, что самый простой способ - преобразовать в использование статических свойств readonly, которые вычисляют значение «на лету».
Например:
public class Values {
public static string BinDir;
public static string OtherDir {
get { return Path.Combine(BinDir,@"Some\Other\Path"); }
}
}
Возможно, вы захотите «кэшировать» результат Path.Combine в поле. Измените BinDir на свойство, а также дайте ему операцию частного набора. – Zyphrax
- 1. Статические члены класса в C++
- 2. Статические функции-члены в C++
- 3. C++ частные статические переменные-члены
- 4. C++ Статические Struct Тип члены
- 5. Non статические члены в C++
- 6. статические члены Повсеместно статические методы
- 7. Что касается использования ManualResetEvent C#?
- 8. Что касается C ЬурейиХ структуры
- 9. Защищенные статические переменные-члены
- 10. Выводя статические члены
- 11. Статические члены python
- 12. Собственное наследование C++ и статические члены/типы
- 13. Почему мы используем статические члены на C#?
- 14. Статические члены и шаблоны в C++
- 15. Objective C - статические члены и постоянные
- 16. статические члены Си ++
- 17. Объяснение Статические члены
- 18. Статические члены в VB.NET
- 19. System.WIndows.Application статические члены потокобезопасны?
- 20. Когда статические члены класса C++ инициализируются?
- 21. статические изменяемые переменные-члены в C++?
- 22. C++ Статические члены класса инициализируются после конструктора
- 23. Статические члены класса экземпляра
- 24. Статические члены вводят объекты?
- 25. статические члены и consts
- 26. Почему можно инициализировать не константные и статические константы-члены-члены, но не статические переменные-члены?
- 27. Статические члены и ошибки LNK в C++
- 28. Доступ статические члены тематических классов
- 29. Что касается C++ Inheritance
- 30. Что касается Inheritance C#
Я думаю, что вы пропустили какую-то скобку '()' или 'get' там – Codesleuth
Но могу ли я изменить AppSetting во время выполнения? Если да, то это решение для меня. – Ikaso
лучший ответ здесь и да, вы можете изменить настройки приложения во время выполнения. – JonH