Экземпляр является исключением только для чтения при изменении культуры в asp.net - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь реализовать мультикультурное приложение, в котором пользователи могут изменять язык, формат даты и т. Д. Я написал ядро, но оно возвращает исключение: System.InvalidOperationException: Экземпляр только для чтения.

switch (culture)
    {
        case SystemCulture.English:
                Thread.CurrentThread.CurrentCulture = new CultureInfo(CultureCodes.English);
                Thread.CurrentThread.CurrentUICulture = new CultureInfo(CultureCodes.English);
                break;
                        //another cultures here
    }
    switch (cultureFormat)
    {
        case SystemDateFormat.European:
                  var europeanDateFormat = CultureInfo.GetCultureInfo(CultureCodes.Italian).DateTimeFormat;
                  Thread.CurrentThread.CurrentCulture.DateTimeFormat = europeanDateFormat;
                  Thread.CurrentThread.CurrentUICulture.DateTimeFormat = europeanDateFormat;
                  break;
    //another cultures here
    }

Я нашел некоторую информацию в Интернете, и мне нужно использовать новый экземпляр объекта моей культуры, я изменил свой код, просто добавив:

CultureInfo myCulture;

switch (culture)
{
       case SystemCulture.English:
            myCulture= new CultureInfo(CultureCodes.English);
            break;
}

и ниже, вне выключателя:

Thread.CurrentThread.CurrentCulture = cultureInfo;

Я не знаком с Threads и не уверен, правильно ли я использовал. Не могли бы вы предложить мне, как это сделать правильно?

1 Ответ

1 голос
/ 06 июля 2019

Вы получаете ошибку Instance is read-only, поскольку пытаетесь изменить свойство в культуре только для чтения с помощью приведенного ниже кода.

Thread.CurrentThread.CurrentCulture.DateTimeFormat = europeanDateFormat;

Вы можете проверить, доступна ли культура только для чтения, с помощью свойства IsReadOnly; встроенные из них.

Вместо этого вы должны сделать клон / копию текущей активной культуры, применить любые изменения к этому клону и назначить его для CurrentCulture и / или CurrentUICulture текущего потока.

var clone = Thread.CurrentThread.CurrentCulture.Clone() as CultureInfo;
clone.DateTimeFormat = CultureInfo.GetCultureInfo("it").DateTimeFormat;

Thread.CurrentThread.CurrentCulture = clone;
Thread.CurrentThread.CurrentUICulture = clone; 
...