Я привык использовать 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.");
Я уже завербовал переадресации в своем классе. Тогда я могу сделать что-то вроде следующего:
var qs = new QueryString(Request.QueryString);
bool q = qs.Get<bool>("q");
Вставьте его в функцию.
Function BooleanOrDefault(byval value as string) as Boolean
dim isBoolean as Boolean, boolValue as Boolean
dim defaultValue as Boolean = False
isBoolean = Boolean.TryParse(value, out boolValue)
BooleanOrDefault = IIF(isBoolean, boolValue, defaultValue)
End Function
Вы можете создать функцию, которая делает весь шаг намного более явным образом (это может быть проще и на прокрутках) и использовать это вместо вашей отдельной строки. кода.