CultureContext
Third parameter of IWriter passes execution contextual information as IServiceProvider.
CultureContext is a simple implementation that carries formatString, FormatArgument and IFormatProvider.
// Create parser
IWriterBase<string, DateTime> dateParser = new DateParser();
// Create cultures
CultureInfo fi = new CultureInfo("fi-FI");
CultureInfo en = new CultureInfo("en");
// Create context
IServiceProvider fiContext = new FormatArgument() { FormatProvider = fi };
IServiceProvider enContext = new FormatArgument() { FormatProvider = en };
// Create date
DateTime date = new DateTime(2020, 1, 1, 1, 1, 1);
// Print Date
string date_fi = date.ToString(fi);
string date_en = date.ToString(en);
WriteLine(date_fi); // "1.1.2020 1.01.01"
WriteLine(date_en); // "1/1/2020 1:01:01 AM"
// Parse date
DateTime date_from_fi_string = dateParser.Read(date_fi, fiContext);
DateTime date_from_en_string = dateParser.Read(date_en, enContext);
WriteLine(date_from_fi_string);
WriteLine(date_from_en_string);
public class DateParser : IWriterToRef<string, DateTime>
{
public bool CanWrite => true;
public Type FromType => typeof(string);
public Type ToType => typeof(DateTime);
public bool TryWrite(string from, ref DateTime to, IServiceProvider? context = null)
{
// Get format provider
IFormatProvider formatProvider =
context?.GetService(typeof(IFormatProvider)) as IFormatProvider ??
context?.GetService(typeof(CultureInfo)) as IFormatProvider ??
CultureInfo.InvariantCulture;
//
DateTimeStyles dateTimeStyles = DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowInnerWhite | DateTimeStyles.AllowTrailingWhite;
// Try parse
if (!DateTime.TryParse(from, formatProvider, dateTimeStyles, out DateTime dateTime)) return false;
// Assign result
to = dateTime;
// Ok
return true;
}
public bool Accept(IWriterVisitor visitor) => visitor is IWriterVisitor writerVisitor ? writerVisitor.Visit(this) : true;
}
SingleLineServiceProvider(Type, object) offers a single value as service provider.
IServiceProvider fiContext =
new SingleLineServiceProvider(typeof(CultureInfo), fi);
DictionaryServiceProvider offers a dictionary as service provider.
IServiceProvider fiContext =
new DictionaryServiceProvider() { { typeof(CultureInfo), fi } };
It can also adapt an existing dictionary to service provider.
// Create dictionary
IDictionary<Type, object> services =
new Dictionary<Type, object> { { typeof(CultureInfo), fi } };
// Create context
IServiceProvider fiContext =
new DictionaryServiceProvider(services);
Full Example
Full example
using System;
using System.Collections.Generic;
using System.Globalization;
using Avalanche.Service;
using Avalanche.Utilities;
using Avalanche.Writer;
using static System.Console;
class context
{
public static void Run()
{
{
// <01>
// Create parser
IWriterBase<string, DateTime> dateParser = new DateParser();
// Create cultures
CultureInfo fi = new CultureInfo("fi-FI");
CultureInfo en = new CultureInfo("en");
// Create context
IServiceProvider fiContext = new FormatArgument() { FormatProvider = fi };
IServiceProvider enContext = new FormatArgument() { FormatProvider = en };
// Create date
DateTime date = new DateTime(2020, 1, 1, 1, 1, 1);
// Print Date
string date_fi = date.ToString(fi);
string date_en = date.ToString(en);
WriteLine(date_fi); // "1.1.2020 1.01.01"
WriteLine(date_en); // "1/1/2020 1:01:01 AM"
// Parse date
DateTime date_from_fi_string = dateParser.Read(date_fi, fiContext);
DateTime date_from_en_string = dateParser.Read(date_en, enContext);
WriteLine(date_from_fi_string);
WriteLine(date_from_en_string);
// </01>
}
{
// Create parser
IWriterBase<string, DateTime> dateParser = new DateParser();
// Create cultures
CultureInfo fi = new CultureInfo("fi-FI");
CultureInfo en = new CultureInfo("en");
// Create context
// <02>
IServiceProvider fiContext =
new SingleLineServiceProvider(typeof(CultureInfo), fi);
// </02>
IServiceProvider enContext = new SingleLineServiceProvider(typeof(CultureInfo), en);
// Create date
DateTime date = new DateTime(2020, 1, 1, 1, 1, 1);
// Print Date
string date_fi = date.ToString(fi);
string date_en = date.ToString(en);
WriteLine(date_fi); // "1.1.2020 1.01.01"
WriteLine(date_en); // "1/1/2020 1:01:01 AM"
// Parse date
DateTime date_from_fi_string = dateParser.Read(date_fi, fiContext);
DateTime date_from_en_string = dateParser.Read(date_en, enContext);
WriteLine(date_from_fi_string);
WriteLine(date_from_en_string);
}
{
// Create parser
IWriterBase<string, DateTime> dateParser = new DateParser();
// Create cultures
CultureInfo fi = new CultureInfo("fi-FI");
CultureInfo en = new CultureInfo("en");
// Create context
// <03>
IServiceProvider fiContext =
new DictionaryServiceProvider() { { typeof(CultureInfo), fi } };
// </03>
IServiceProvider enContext = new SingleLineServiceProvider(typeof(CultureInfo), en);
// Create date
DateTime date = new DateTime(2020, 1, 1, 1, 1, 1);
// Print Date
string date_fi = date.ToString(fi);
string date_en = date.ToString(en);
WriteLine(date_fi); // "1.1.2020 1.01.01"
WriteLine(date_en); // "1/1/2020 1:01:01 AM"
// Parse date
DateTime date_from_fi_string = dateParser.Read(date_fi, fiContext);
DateTime date_from_en_string = dateParser.Read(date_en, enContext);
WriteLine(date_from_fi_string);
WriteLine(date_from_en_string);
}
{
// Create parser
IWriterBase<string, DateTime> dateParser = new DateParser();
// Create cultures
CultureInfo fi = new CultureInfo("fi-FI");
CultureInfo en = new CultureInfo("en");
// <04>
// Create dictionary
IDictionary<Type, object> services =
new Dictionary<Type, object> { { typeof(CultureInfo), fi } };
// Create context
IServiceProvider fiContext =
new DictionaryServiceProvider(services);
// </04>
IServiceProvider enContext = new SingleLineServiceProvider(typeof(CultureInfo), en);
// Create date
DateTime date = new DateTime(2020, 1, 1, 1, 1, 1);
// Print Date
string date_fi = date.ToString(fi);
string date_en = date.ToString(en);
WriteLine(date_fi); // "1.1.2020 1.01.01"
WriteLine(date_en); // "1/1/2020 1:01:01 AM"
// Parse date
DateTime date_from_fi_string = dateParser.Read(date_fi, fiContext);
DateTime date_from_en_string = dateParser.Read(date_en, enContext);
WriteLine(date_from_fi_string);
WriteLine(date_from_en_string);
}
}
// <21>
public class DateParser : IWriterToRef<string, DateTime>
{
public bool CanWrite => true;
public Type FromType => typeof(string);
public Type ToType => typeof(DateTime);
public bool TryWrite(string from, ref DateTime to, IServiceProvider? context = null)
{
// Get format provider
IFormatProvider formatProvider =
context?.GetService(typeof(IFormatProvider)) as IFormatProvider ??
context?.GetService(typeof(CultureInfo)) as IFormatProvider ??
CultureInfo.InvariantCulture;
//
DateTimeStyles dateTimeStyles = DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowInnerWhite | DateTimeStyles.AllowTrailingWhite;
// Try parse
if (!DateTime.TryParse(from, formatProvider, dateTimeStyles, out DateTime dateTime)) return false;
// Assign result
to = dateTime;
// Ok
return true;
}
public bool Accept(IWriterVisitor visitor) => visitor is IWriterVisitor writerVisitor ? writerVisitor.Visit(this) : true;
}
// </21>
}