Chciałbym unikać refleksji, jeśli to możliwe. Nie chciałbym postawić na twoje podejście do pracy z przyszłymi wersjami :)
Możesz przesłać prośbę o dodanie tej funkcji dla przyszłych wersji, ale na razie rozbudowałem Twój słownik odwrotny w bardziej stabilny sposób sposób:
// Note: this version lets you work with any IDateTimeZoneSource, although as the only
// other built-in source is BclDateTimeZoneSource, that may be less useful :)
private static IDictionary<string, string> LoadTimeZoneMap(IDateTimeZoneSource source)
{
var nodaToWindowsMap = new Dictionary<string, string>();
foreach (var bclZone in TimeZoneInfo.GetSystemTimeZones())
{
var nodaId = source.MapTimeZoneId(bclZone);
if (nodaId != null)
{
nodaToWindowsMap[nodaId] = bclZone.Id;
}
}
return nodaToWindowsMap;
}
oczywiście, to nie obejmie wszystkie strefy czasowe w TZDB. W rzeczywistości nie będzie nawet podawać wszystkich informacji, które możemy przekazać na podstawie informacji CLDR, których używamy ... CLDR daje wiele odwzorowań dla każdego identyfikatora Windows, a my przechowujemy tylko ten pierwszy w danym momencie. Próbowaliśmy dowiedzieć się, jak to ujawnić, ale jeszcze nie udało się. Myśli są mile widziane na liście mailingowej Noda Time :)
Należy również pamiętać, że tylko dlatego, że istnieje mapowanie pomiędzy strefami BCL i TZDB, nie oznacza to, że faktycznie dają one identyczne wyniki dla wszystkich - to tylko najbliższe mapowanie dostępne.
Który plik IANA ma na myśli, przy okazji? Wiem, że istnieje CLDR, ale jeśli IANA zapewnia to w innym formacie, byłoby to interesujące ... –