Я привык использовать TryParse для попытки анализа неизвестных типов:
Dim b As Boolean
Dim qVal As Boolean = If(Boolean.TryParse(Request.QueryString("q").Trim(), b), b, False)
или
bool b;
bool qVal = (Boolean.TryParse(Request.QueryString("q").Trim(), out b) ? b : false;
Итак, просто любопытно, если кто-то знает лучший способ сделать это, кроме использования троичного оператора.
<ч />
Решение
Здравствуйте,
Так как сообщение было закрыто, я уверен, что это решение будет похоронено там, но я создал довольно классный класс, который решает проблему выше, используя совет, который мне дали. Просто хотел выложить код на случай, если кто-то наткнется на этот поток и захочет использовать его:
public static class PrimitiveType
{
/// <summary>
/// This function will return a parsed value of the generic type specified.
/// </summary>
/// <typeparam name="valueType">Type you are expecting to be returned</typeparam>
/// <param name="value">String value to be parsed</param>
/// <param name="defaultValue">Default value in case the value is not parsable</param>
/// <returns></returns>
public static valueType ParseValueType<valueType>(string value, valueType defaultValue)
{
MethodInfo meth = typeof(valueType).GetMethod("Parse", new Type[] { typeof(string) });
if (meth != null)
{
try
{
return (valueType) meth.Invoke(null, new object[] { value });
}
catch (TargetInvocationException ex)
{
if (ex.InnerException.GetType() == typeof(FormatException) || ex.InnerException.GetType() == typeof(OverflowException))
{
return defaultValue;
}
else throw ex.InnerException;
}
}
else
{
throw new ArgumentException("Generic type must be a valid Value Type that has a Parse method.");
}
}
}
Это довольно просто в использовании. Просто передайте тип, который вы ожидаете, как общий и предоставьте строковое значение для анализа и значение по умолчанию, если строка не может быть проанализирована. Если вы предоставите класс вместо примитивного типа, он будет throw new ArgumentException("Generic type must be a valid Value Type that has a Parse method.");