Winforms:TypeConverter.IsValid中的改动

TypeConverter是我们在做类型转换时经常会被用到的一个类型。在做类型转换之前,我们首先需要判断待转换的值是不是有效的。比如我们打算把一个字符串转换为整数值,首先我们需要判断该字符串表示的是不是一个有效的整数。.NET团队在设计类型TypeConverter的时候,方法TypeConverter.IsValid(Object)就是用来判断传入的参数对于转换的目标类型是不是有效。

一、在.NET 2.0中调用TyoeConverter.IsValid

1.       Visual Studio 2010中创建一个基于.NET 2.0Console工程;

2.       Main中添加如下代码:

        TypeConverter converter = new BooleanConverter();

        String str = "flase";

        bool valid = converter.IsValid(str);

        Console.WriteLine(str + (valid ? " is" : " is not") + " a valid bolean value");

 

        converter = new Int32Converter();

        str = "123$";

        valid = converter.IsValid(str);

        Console.WriteLine(str + (valid ? " is" : " is not") + " a valid int value");

 

3.       编译运行。我们发现运行的结果是“flase”是一个有效的布尔值,“123$”也是一个整数值。

上述结果可能和很多人预期不一致。“flase”中有一个单词拼写错误,而“123$”也含有一个非数字字符。因此,我们预期上述代码中两次调用IsValid 应该返回false

为什么上述代码中会返回true呢?这是因为最初在设计开发TypeConverter时,TypeConverter.IsValid始终返回true。类型TypeConcerter的开发者希望TypeConverter的子类自己定义它的IsValidTypeConverter的子类在重写(overrideIsValid时,可以根据自己类型的特点来判断输入的参数是不是有效的。但遗憾的是,.NET中的TypeConverter的所有子类比如BooleanConverterInt32Converter并没有重写IsValid方法。因此我们在调用IsValid的时候,不管输入是什么,都一律返回true

二、在.NET 4.0中调用TyoeConverter.IsValid

在开发.NET 4.0时,我们意识到IsValid的不合理,于是做了修改。我们在基类TypeConverterIsValid中,会判断输入的参数是不是真的有效,如果有效则返回true,否则返回false

如果我们在Visual Studio中创建一个基于.NET 4.0Console工程,并添加前面的代码。编译运行之后,我们发现此时两次调用IsValid,都是返回false

可能有些程序员会担心此次改动会导致原先运行正常的程序现在会出问题。我们在修改TypeConvert.IsValid的时候,意识到了程序员的这种担忧。如果程序员希望该方法还是保留.NET 2.0中的行为,他可以为程序添加一个配置文件(后缀为*.config),并添加如下设置:

<configuration>

    <appSettings>

      <add key="UseCompatibleTypeConverterBehavior" value="true" />

    </appSettings>

</configuration>

如果我们在.NET 4.0的程序中添加了上述设置,TypeConverter.IsValid仍然按照.NET 2.0的行为不管输入的参数是否有效始终返回false

你可能感兴趣的:(.net,object,String,2010,WinForms)