5

TypeConverter.IsValid()現在のスレッド カルチャを使用しているようですが、使用してTypeConverter.ConvertFrom()いません。

これにより、インバリアント カルチャでない限り、この型を使用TypeConverter.IsValid()してもほとんど役に立ちません。DateTime確かに、それはバグのようです。

TypeConverter.IsValid()現在の文化を利用する方法を知っている人はいますか?

次のコードは、問題を示しています。

DD/MM/YYYY 形式と MM/DD/YYYY 形式の 2 つの文字列を使用します。

テストの最初の部分は、インバリアント カルチャで行われます。TypeConverter.IsValid()が MM/DD/YYYY 文字列に対して trueを 返し、 を使用TypeConverter.ConvertFrom()してその文字列をDateTime.

TypeConverter.IsValid()最初の部分は、DD/MM/YYYY 文字列に対して false を返すことも示しています。

2 番目の部分では、「DD/MM/YYYY」の日付を使用する現在のカルチャ「en-GB」を変更します。

結果が逆になることが予想IsValid()されますが、2 つの文字列に対して以前と同じ結果が返されます。したがって、MM/DD/YYYY 文字列が有効であることがわかります。

ただし、これは重要な点ですが、問題ないと言われTypeConverter.ConvertFrom()ている文字列を実際に変換しようとするTypeConverter.IsValid()と、例外が発生します。

これを回避する方法はありますか?

using System;
using System.ComponentModel;
using System.Globalization;
using System.Threading;

namespace Demo
{
    class Program
    {
        void Run()
        {
            // Start off with the US culture, which has MM/DD/YYYY date format.

            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

            var dateConverter = TypeDescriptor.GetConverter(typeof(DateTime));
            var goodDateString = "07/19/1961";
            var badDateString  = "19/07/1961";

            test(dateConverter, goodDateString, "DateTime"); // Says it's good.
            test(dateConverter, badDateString, "DateTime");  // Says it's bad.

            var dateTimeValue = (DateTime) dateConverter.ConvertFrom(goodDateString);

            Console.WriteLine("dateTimeValue = " + dateTimeValue);
            Console.WriteLine();

            // Now lets change the current culture to the UK, which has DD/MM/YYYY date format.

            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
            dateConverter = TypeDescriptor.GetConverter(typeof(DateTime));

            test(dateConverter, goodDateString, "DateTime"); // Still says it's good.
            test(dateConverter, badDateString, "DateTime");  // Still says it's bad.

            // TypeConverter.IsValid(badDateString) returns false, so we shouldn't be able to convert it.
            // Well, we can, like so:

            dateTimeValue = (DateTime)dateConverter.ConvertFrom(badDateString); // Shouldn't work according to "IsValid()"
            Console.WriteLine("dateTimeValue (bad) = " + dateTimeValue);        // But this is printed ok.

            // TypeConverter.IsValid(goodDateString) returns true, so we can convert it right?
            // Well, no. This now throws an exception, even though "IsValid()" returned true for the same string.

            dateTimeValue = (DateTime)dateConverter.ConvertFrom(goodDateString); // This throws an exception.
        }

        void test(TypeConverter converter, string text, string type)
        {
            if (converter.IsValid(text))
                Console.WriteLine("\"" + text + "\" IS a valid " + type);
            else
                Console.WriteLine("\"" + text + "\" is NOT a valid " + type);
        }

        static void Main()
        {
            new Program().Run();
        }
    }
}
4

1 に答える 1