Piers Myers Piers Myers - 2 months ago 10
C# Question

Generic TryParse

I am trying to create a generic extension that uses 'TryParse' to check if a string is a given type:

public static bool Is<T>(this string input)
{
T notUsed;
return T.TryParse(input, out notUsed);
}


this won't compile as it cannot resolve symbol 'TryParse'

As I understand, 'TryParse' is not part of any interface.

Is this possible to do at all?

Update:

Using the answers below I have come up with:

public static bool Is<T>(this string input)
{
try
{
TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input);
}
catch
{
return false;
}

return true;
}


It works quite well but I think using exceptions in that way doesn't feel right to me.

Update2:

Modified to pass type rather than use generics:

public static bool Is(this string input, Type targetType)
{
try
{
TypeDescriptor.GetConverter(targetType).ConvertFromString(input);
return true;
}
catch
{
return false;
}
}

Answer

You should use the TypeDescriptor class:

public static T Convert<T>(this string input)
{
    try
    {
            var converter = TypeDescriptor.GetConverter(typeof(T));
            if(converter != null)
            {
                // Cast ConvertFromString(string text) : object to (T)
                return (T)converter.ConvertFromString(input);
            }
            return default(T);
    }
    catch (NotSupportedException)
    {
            return default(T);
    }
}
Comments