Есть ли способ установить DLL, чтобы всегда следовать CultureInfo.Инвариантная культура по умолчанию, если не указано?



У меня есть много кода в библиотеке классов, который не указывает CultureInfo.InvariantCulture. Например, в операциях toString, toBool, toInt и т. д.



Есть ли способ, которым я могу задать свойство для библиотеки классов, чтобы она всегда выполнялась с использованием CultureInfo.InvariantCulture, даже если оно не указано явно везде в коде?



Что-то вроде глобального переключателя?



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



if (Convert.ToInt16(task.RetryCount, CultureInfo.InvariantCulture) <
Convert.ToInt16(ConfigurationManager.AppSettings["TasksMaxRetry"], CultureInfo.InvariantCulture))
347   2  
c#

2 ответов:

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

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

private static readonly IFormatProvider parseFormat = CultureInfo.InvariantCulture;

Затем используйте это поле в любых вызовах для преобразования методов или аналогичных. Объявление поля в качестве IFormatProvider, вместе с хорошо выбранным именем, сообщает читателю код очень явно, что это поле используется для определения формата синтаксического анализа. ИМХО, это делает намерение кода более ясным.

Другой способ сделать это-создать свой собственный класс Parse / Convert, который обертывает Convert.ToXxx методы и вызывает их с форматом, который вы собираетесь использовать. Тогда у вас будет желаемое преимущество-не нужно будет явно указывать формат в каждом вызове.

Я так не думаю, но можно установить CultureInfo на основе каждого потока:

Console.WriteLine(double.Parse("1.000"));
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Console.WriteLine(double.Parse("1.000"));

Вывод на моей машине (ваш вывод может варьироваться в зависимости от вашей текущей культуры):

1000
1

Это то, что вы хотите?

Comments

    Ничего не найдено.