Обойти для PritiveType.TryParse

2

Я привык использовать 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.");

  • 0
    В качестве небольшой модификации вашего кода вы можете переместить код GetMethod () в статический конструктор. Используйте Delegate.CreateDelegate ([тип делегата], мет) и сохраните полученный делегат как статический член var. Затем вы можете повторно использовать ваш метод ParseValueType с меньшим снижением производительности. Примечание: это предполагает, что вы перемещаете общую спецификацию на уровень класса, а не на уровень метода.
Теги:
parsing

3 ответа

6
Лучший ответ

Я уже завербовал переадресации в своем классе. Тогда я могу сделать что-то вроде следующего:

var qs = new QueryString(Request.QueryString);
bool q = qs.Get<bool>("q");
  • 0
    +1 для краткого и простого для чтения кода.
  • 0
    Это действительно хороший подход. Спасибо за совет.
Показать ещё 3 комментария
2

Вставьте его в функцию.

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
1
  • Вставьте комментарий.
  • Воспитывайте юниоров, они не поправятся, если они не спросят, и вы ответите на их вопросы.
  • Оба вышеуказанных.

Вы можете создать функцию, которая делает весь шаг намного более явным образом (это может быть проще и на прокрутках) и использовать это вместо вашей отдельной строки. кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню