C# - как определить, является ли Тип числом

Вы можете использовать функцию jquery toggle () для задачи

 $("#btnsearch").click(function(){
    $("#Show").toggle();
  });

. С помощью функции jquery toggle () автоматически скрыть и показать целевой элемент #Show

93
задан Konamiman 19 January 2019 в 22:31
поделиться

9 ответов

Попробуйте следующее:

Type type = object.GetType();
bool isNumber = (type.IsPrimitiveImple && type != typeof(bool) && type != typeof(char));

Типы примитивов: Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Char, Double и Один.

Взяв решение Гийома немного дальше:

public static bool IsNumericType(this object o)
{   
  switch (Type.GetTypeCode(o.GetType()))
  {
    case TypeCode.Byte:
    case TypeCode.SByte:
    case TypeCode.UInt16:
    case TypeCode.UInt32:
    case TypeCode.UInt64:
    case TypeCode.Int16:
    case TypeCode.Int32:
    case TypeCode.Int64:
    case TypeCode.Decimal:
    case TypeCode.Double:
    case TypeCode.Single:
      return true;
    default:
      return false;
  }
}

Использование:

int i = 32;
i.IsNumericType(); // True

string s = "Hello World";
s.IsNumericType(); // False
98
ответ дан 24 November 2019 в 06:11
поделиться

Введите расширение с поддержкой пустого типа.

public static bool IsNumeric(this Type type)
    {
        if (type == null) { return false; }

        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            type = type.GetGenericArguments()[0];
        }

        switch (Type.GetTypeCode(type))
        {
            case TypeCode.Byte:
            case TypeCode.SByte:
            case TypeCode.UInt16:
            case TypeCode.UInt32:
            case TypeCode.UInt64:
            case TypeCode.Int16:
            case TypeCode.Int32:
            case TypeCode.Int64:
            case TypeCode.Decimal:
            case TypeCode.Double:
            case TypeCode.Single:
                return true;
            default:
                return false;
        }
    }
1
ответ дан 24 November 2019 в 06:11
поделиться

упс! Неправильно прочитал вопрос! Лично я бы сделал бросок с Скит .


хм, похоже, вы хотите DoSomething на Введите ваших данных. Вы можете сделать следующее

public class MyClass
{
    private readonly Dictionary<Type, Func<SomeResult, object>> _map = 
        new Dictionary<Type, Func<SomeResult, object>> ();

    public MyClass ()
    {
        _map.Add (typeof (int), o => return SomeTypeSafeMethod ((int)(o)));
    }

    public SomeResult DoSomething<T>(T numericValue)
    {
        Type valueType = typeof (T);
        if (!_map.Contains (valueType))
        {
            throw new NotSupportedException (
                string.Format (
                "Does not support Type [{0}].", valueType.Name));
        }
        SomeResult result = _map[valueType] (numericValue);
        return result;
    }
}
-1
ответ дан 24 November 2019 в 06:11
поделиться

Все они являются типами значений (кроме bool и, возможно, enum). Таким образом, вы можете просто использовать:

bool IsNumberic(object o)
{
    return (o is System.ValueType && !(o is System.Boolean) && !(o is System.Enum))
}
0
ответ дан 24 November 2019 в 06:11
поделиться

К сожалению, у этих типов не так много общего, кроме как все они являются типами значений. Но чтобы избежать длинного варианта переключения, вы можете просто определить список только для чтения со всеми этими типами, а затем просто проверить, находится ли данный тип внутри списка.

0
ответ дан 24 November 2019 в 06:11
поделиться

, вызвавшие некоторые проблемы с помощью рекурсии, например исключения StackOverFlow и т.п., будут выбрасываться внутри блоков try ... catch, потому что они фактически не выбрасываются из какой-либо конкретной строки кода в блоке, а скорее являются CLR. Это также верно для исключений памяти вне допустимого диапазона и других проблем, которые не являются прямым результатом какой-либо одной строчки кода.

Возможно, вы говорите о чем-то вроде этого:

3
ответ дан 24 November 2019 в 06:11
поделиться
public static bool IsNumericType(Type type)
{
  switch (Type.GetTypeCode(type))
  {
    case TypeCode.Byte:
    case TypeCode.SByte:
    case TypeCode.UInt16:
    case TypeCode.UInt32:
    case TypeCode.UInt64:
    case TypeCode.Int16:
    case TypeCode.Int32:
    case TypeCode.Int64:
    case TypeCode.Decimal:
    case TypeCode.Double:
    case TypeCode.Single:
      return true;
    default:
      return false;
  }
}

Замечание об оптимизации удалено (см. Комментарии enzi) И если вы действительно хотите оптимизировать его (теряя читаемость и некоторую безопасность ...):

public static bool IsNumericType(Type type)
{
  TypeCode typeCode = Type.GetTypeCode(type);
  //The TypeCode of numerical types are between SByte (5) and Decimal (15).
  return (int)typeCode >= 5 && (int)typeCode <= 15;
}

36
ответ дан 24 November 2019 в 06:11
поделиться

Краткий ответ: Нет.

Более длинный ответ: Нет.

Дело в том, что многие различные типы в C # могут содержать числовые данные. Если вы не знаете, чего ожидать (Int, Double и т. Д.), Вам нужно использовать «длинный» оператор case.

1
ответ дан 24 November 2019 в 06:11
поделиться

Не используйте переключатель - просто используйте набор:

HashSet<Type> NumericTypes = new HashSet<Type>
{
    typeof(decimal), typeof(byte), typeof(sbyte),
    typeof(short), typeof(ushort), ...
};

РЕДАКТИРОВАТЬ: Одно из преимуществ этого перед использованием кода типа заключается в том, что когда в .NET вводятся новые числовые типы (например, BigInteger и Complex ) легко настроить - тогда как эти типы не будут получить код типа.

85
ответ дан 24 November 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: