StreamWriter и IFormatProvider

Как передать IFormatProvider в StreamWriter?

В частности, я хочу создать new StreamWriter("myfile.txt", CultureInfo.InvariantCulture);

TextWriter и StringWriter имеют параметр для этого в конструкторе, но StreamWriter этого не делает.
Свойство stringWriter.FormatProvider - только для чтения.

Я мог бы подумать о трех обходных решениях, которые кажутся плохими решениями:

  • Изменение Thread.CurrentCulture: это будет в библиотеке, поэтому я бы не захотел изменять глобальные настройки, даже временно.
  • sw.WriteLine(InvariantCulture,): Существует несколько sw.WriteLine() для нескольких функций. Я действительно хотел бы избежать возиться со всеми из них.
  • сначала используя StringWriter, а затем записывая строку в файл: поскольку поток может стать очень большим, это повлечет за собой огромные накладные расходы.

Можно ли указать FormatProvider для StreamWriter? Основываясь на Inheritance from TextWriter, StreamWriter должен иметь средства для обработки этого, если бы я мог просто установить свойство.

Ответы

Ответ 1

Так как свойство FormatProvider является виртуальным, вы можете создать свой собственный подкласс, который принимает IFormatProvider:

public class FormattingStreamWriter : StreamWriter
{
    private readonly IFormatProvider formatProvider;

    public FormattingStreamWriter(string path, IFormatProvider formatProvider)
        : base(path)
    {
        this.formatProvider = formatProvider;
    }
    public override IFormatProvider FormatProvider
    {
        get
        {
            return this.formatProvider;
        }
    }
}

Ответ 2

Вы можете создать новый класс, наследующий от StreamWriter, и переопределить виртуальное свойство FormatProvider.