Universal data type checker

Jan 30, 2007

In many different scenarios we need to check if a string can be converted into an integer e.g. This could be when we work with query strings and need to check if they match a certain data type. In VB.NET you can use the IsNumeric and IsDate functions, but that's about it. You are left to your own data type checking logic the rest of the time. It would be cool if we could have a method that could check all data types that is represented by strings such as integers, guids, booleans etc.

Here is a method that does just that. It can check all the string based types and also enums.

 
/// <summary> /// Checks the specified value to see if it can be /// converted into the specified type. /// <remarks> /// The method supports all the primitive types of the CLR /// such as int, boolean, double, guid etc. as well as other /// simple types like Color and Unit and custom enum types. /// </remarks> /// </summary> /// <param name="value">The value to check.</param> /// <param name="type">The type that the value will be checked against.</param> /// <returns>True if the value can convert to the given type, otherwise false.</returns> public static bool CanConvert(string value, Type type) { if (string.IsNullOrEmpty(value) || type == null) return false; System.ComponentModel.TypeConverter conv = System.ComponentModel.TypeDescriptor.GetConverter(type); if (conv.CanConvertFrom(typeof(string))) { try { conv.ConvertFrom(value); return true; } catch { } } return false; }

Example of use

Let's try some different examples

 
CanConvert("12", typeof(int)); // returns true CanConvert("f637a876-9d58-4229-9559-a5e42a95fdac ", typeof(Guid)); // returns true CanConvert("Backspace", typeof(System.ConsoleKey)); // returns true CanConvert("10px", typeof(System.Web.UI.WebControls.Unit)); // returns true CanConvert("red", typeof(System.Drawing.Color)); // returns true
* $4.95/month BlogEngine.net Hosting – Click Here!

Comments (4) -

Francesco
Francesco
1/30/2007 9:50:02 AM #

I always learn something from your posts. Thanks very much for sharing your knowledge

 Eber Irigoyen
Eber Irigoyen
1/30/2007 10:14:46 PM #

the RSS (in google reader) is reeeeeeaaally messed up (the code)

 Damien Guard
Damien Guard
1/31/2007 2:29:59 PM #

The problem with this is that typically after the test you will then perform the conversion.  This method means you end up doing every conversion twice - once for the test and once for real.  This can be a real performance problem with strings which is why .NET 2.0 includes the TryParse methods.

Int32 result;
if (Int32.TryParse("12", out result)) {
  // Go do something with result
}

[)amien

 James Curran
James Curran
1/31/2007 4:42:44 PM #

Of course, with generics, we can simplify the method call, and incorporate the actual conversion:
public static bool TryConvert < T >(string value, out T t)
{
  t= default(T);
  if (string.IsNullOrEmpty(value))
    return false;

  System.ComponentModel.TypeConverter conv = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T));
  if (conv.CanConvertFrom(typeof(string)))
  {
    try
    {
      t = (T) conv.ConvertFrom(value);
      return true;
    }
    catch
    {
  }
  }

  return false;
}

/*   Called like
       int a;
       if (CanConvert("123", out a))
*/

In fact, you can extend it to any two types:
public static bool TryConvert < T, U > (U value, out T t) where U:class
{
    t= default(T);
  if (value == null)
      return false;

  System.ComponentModel.TypeConverter conv = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T));
  if (conv.CanConvertFrom(typeof(U)))
  {
    try
    {
      t = (T) conv.ConvertFrom(value);
      return true;
    }
    catch { }
  }
  return false;
}
(note this is limited to converting a reference type to any type.  To convert any type to any type, remove the where clause, and the "if (value == null)" clause.  Also, note the just because you think something can be convertable, doesn't mean that the CLR does.  A double cannot be converted to an int, for example.

Comments are closed

About the author

Mads Kristensen

Mads Kristensen
Program Manager at the Microsoft Web Platform team and founder of BlogEngine.NET.

More...

Month List

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer’s view in any way.