C # Установить конкретную культуру для класса - PullRequest
5 голосов
/ 23 февраля 2010

У меня есть класс в C #, который имеет различные методы. Я хочу использовать культуру en-US во всех методах этого класса. Можно ли установить культуру для определенного класса?

Фон : у меня есть List<object>, и некоторые из object являются числами, а некоторые - строками. Я хотел бы, чтобы все числа были написаны с использованием американской культуры, но я не знаю, какие из них являются числами. ToString() класса object, похоже, не принимает культурный аргумент.

Ответы [ 2 ]

5 голосов
/ 23 февраля 2010

Класс - это структура данных, а локализованное форматирование строк - это поведение. С точки зрения кода / компилятора, эти две вещи не имеют ничего общего друг с другом, и не имеет смысла устанавливать их для каждого класса. Эта проблема относится к области кода, который использует класс, или к коду внутри самого класса.

Глобальная информация о культуре задается для каждого потока (с использованием Thread.CurrentThread.CurrentCulture или CultureInfo.CurrentCulture). Одна вещь, которую вы можете сделать, это обернуть каждый метод класса в набор / восстановление культуры. Поскольку культура потоков для всех целей является глобальной переменной, это может стать проблематичным, если ваш класс когда-нибудь вызовет что-то другое.

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

class MyClass {
    public CultureInfo Culture { get; set; }

    public void GetSomeString() {
        return new Int32().ToString(Culture);
    }
}

Редактировать: Если присмотреться к вашему вопросу, я думаю, что вы хотите сделать что-то вроде:

var lastCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
try {
   // loop over list here
}
finally {
    Thread.CurrentThread.CurrentCulture = lastCulture;
}
0 голосов
/ 23 февраля 2010

Вы можете попробовать кастовать свои предметы и вызвать ToString для получающегося предмета, указав localizationa (перехватывать InvalidCastException, когда это происходит и обрабатывать его соответствующим образом), так как это разрешено в строке или числе.Решение в лучшем случае вонючее, но работоспособное.

...