Изменить статическую переменную «динамически» в c#

#c# #asp.net #.net

#c# #asp.net #.net

Вопрос:

У меня есть приведенный ниже класс, где я устанавливаю, какой язык должен быть «запущенным» языком на веб-сайте.
Прямо сейчас я просто добавляю / удаляю комментарии к языку, который я хочу выбрать, перед запуском / отладкой моего проекта.

Я хотел бы иметь возможность динамически изменять язык во время работы моего веб-сайта.
Как бы вы это сделали (я бы хотел избежать ее решения с использованием параметра сеанса или файла cookie, который закончится в какой-то день в будущем)

 public class LanguageCodes
{
    public const string DenmarkCode = "DK";
    public const string SwedenCode = "SE";
}

public class LanguageFactory
{
    public static readonly string CurrentLanguage =
     LanguageCodes.DenmarkCode; 
   //LanguageCodes.SwedenCode;

    public static AbstractLanguage Current {
        get {
            switch (CurrentLanguage)
            {
                case LanguageCodes.DenmarkCode: return new LanguageDK();
                case LanguageCodes.SwedenCode: return new LanguageSE();
            }
            return null;
        }
    }
  

Комментарии:

1. Это уже доступно через . Сама СЕТЬ, в свойствах CurrentCulture и CurrentUICulture потока запроса. Это те свойства, которые управляют тем, какие строки ресурсов загружаются, как числа и даты форматируются и анализируются.

2. С другой стороны, если вы не используете Session или Cookie, изменение статической переменной будет применяться ко всем пользователям.

3. Почему вы хотите изменить веб-сайт? Клиент должен указать язык в запросе или получить язык по умолчанию от клиента.

4. Проверьте автоматический выбор языков Рика Страла для локализации в ASP.NET . Здесь показано, как вы можете настроить язык, используя различные методы, либо автоматически, либо из профиля пользователя.

5. Глобализация и локализация в ASP.NET Core в документах объясняет, как эти вещи работают в ASP.NET Ядро. Концепции аналогичны ASP.NET Веб-формы или MVC, так что это стоит прочитать

Ответ №1:

В вашей текущей реализации вы не можете этого сделать.

const это известная при компиляции переменная, и ее нельзя редактировать даже с помощью reflections.

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

Однако вы можете поиграть с

Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");

ссылка

Если вы хотите сохранить изменение вашей реализации const на static

    public class LanguageCodes
    {
        public static string DenmarkCode = "DK";
        public static string SwedenCode = "SE";
    }

   ///

    public static string CurrentLanguage
  

Комментарии:

1. Но все мои языковые свойства хранятся в моих собственных классах — я не использую пользовательские классы языка .net. Я просто делаю это: общедоступный класс LanguageDK: AbstractLanguage { общедоступная строка переопределения BeskedSkalUdfyldes => «Бескедовый скал udfyldes.»; Так что, я думаю, я не могу использовать Thred. currentThread. Текущая культура или?

2. Поэтому измените тип на «Static» без const.

3. @NickDeveloper почему вы пытаетесь изобрести велосипед? Вы не можете модифицировать язык, если не измените настройки CurrentCulture и CurrentUICulture. Независимо от того, что делают ваши классы, строки будут форматироваться с использованием CurrentCulture потока. Строки пользовательского интерфейса будут сгенерированы с использованием CurrentUICulture. Это описано в документации каждого ASP.NET stack — Webforms, MVC, ASP.NET Ядро

4. @Sebastian506563 если я правильно понял, Op не пытается изменить DenmarkCode or SwedenCode (в конце концов, они постоянны и не связаны с текущим языком пользовательского интерфейса), но CurrentLanguage (который был объявлен как readonly , поэтому возникает аналогичная проблема)

5. Это единственное решение для преобразования моих классов в классы родного языка / культуры .net? или я могу это исправить, удалив const? Смогу ли я тогда динамически изменять то, на что указывает переменная CurrentLanguage?

Ответ №2:

Сегодня я действительно увидел этот способ, который может быть полезен:

  private const string someString="my name is {0}";

 string newString = string.Format(someString, "Didi");
  

Комментарии:

1. Можете ли вы объяснить (отредактировать свой ответ), как это помогает OP с проблемой языка?