Я хотел бы создать функцию, которая проверяет, передало ли числовое значение, поскольку аргумент имеет значение, больше, чем нуль. Что-то вроде этого:
public bool IsGreaterThanZero(object value)
{
if(value is int)
{
return ((int)value > 0);
}
else if(value is float)
{
// Similar code for float
}
return false;
}
Я могу попытаться снять объект, переданный в качестве аргумента функции одному типу числовых данных, таким образом, я могу затем выдержать сравнение, он для обнуления вместо того, чтобы проверить на каждого вводит мой если оператор? Если бы состав исполнителей перестал работать, я возвратил бы false. Существует ли лучшее (чтение короче, более читаемо) способ сделать это?
Править: Некоторые спросили о том, если я знаю, что тип будет числовым, почему объект и т.д. Я надеюсь, что это делает вещи более ясными.
Эта функция была бы частью преобразователя Silverlight, который реализует IValueConverter
интерфейс, который имеет подпись преобразования
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
Первое, я только хотел, чтобы преобразователь работал с ints, но мое воображение начало разрастаться и думать что, если у меня есть числа с плавающей точкой и другие числовые типы. Я хотел сделать преобразователь максимально гибким. Первоначально я думал, что вся эта дополнительная информация помешает тому, что я хотел сделать так, я не включал ее в свой вопрос.
Я бы предпочел следующее:
public bool IsGreaterThanZero(object value)
{
if(value is IConvertible)
{
return Convert.ToDouble(value) > 0.0;
}
return false;
}
Это позволит безопасно обрабатывать все типы IConvertible (которые включают все типы с плавающей точкой и целые типы в фреймворке, а также любые пользовательские типы).
Знает ли caller тип? Если да, то как насчёт:
public static bool GreaterThanZero<T>(T value) where T : struct, IComparable<T>
{
return value.CompareTo(default(T)) > 0;
}
Преобразования не требуются, и должны работать для любого из встроенных числовых типов - и любых разумных типов значений, которые вы придумаете сами. (Например, это было бы хорошо со структурой Noda Time Duration
.)
Обратите внимание, что вызывающему абоненту не обязательно знать тип напрямую - он может знать его только как другой параметр типа с теми же ограничениями. По общему признанию, это может не подходить для вашей ситуации, но я подумал, что все равно упомяну об этом. Если никто не знает тип во время компиляции (и вы не хотите получать динамическую типизацию, чтобы сделать работу за вас в C# 4!), то вызов Convert.ToDouble
, вероятно, ваш лучший выбор - просто имейте в виду, что у него могут быть проблемы для System.Numerics.BigInteger
из .NET 4.0.
Вы можете избежать бокса и распаковки с помощью универсальных шаблонов:
Вот определение функции
class GenericComparation {
public static bool IsGreaterThanZero<T>(T value) where T : IComparable<T> {
// Console.WriteLine(value.GetType().Name)
return value.CompareTo(default(T)) > 0;
}
}
Использование:
Console.WriteLine(GenericComparation.IsGreaterThanZero(1));
Console.WriteLine(GenericComparation.IsGreaterThanZero(-1.1));
Console.WriteLine(GenericComparation.IsGreaterThanZero(Decimal.Zero));
А? Какие числовые типы вас интересуют?
public bool IsGreaterThanZero(double value)
{
return value > 0;
}
Все они работают ...
IsGreaterThanZero((int)2);
IsGreaterThanZero((long)2);
IsGreaterThanZero((double)2);
IsGreaterThanZero((float)2);
IsGreaterThanZero((byte)2);
IsGreaterThanZero((ulong)2);
Почему бы просто не преобразовать Convert.ToDouble или Convert.ToDecimal, а затем выполнить сравнение? Кажется, что так можно обработать большинство типов, которые кто-то может передать.
Этот самый простой и быстрый способ сравнить любой числовой тип с нулем выглядит следующим образом:
public bool IsGreaterThanZero(object value)
{
if (value != null && value.GetType().IsValueType)
return System.Convert.ToDouble(value) > 0;
return false;
}
Попробуйте:
double tempValue;
if(double.TryParse(value.ToString(), out tempValue)
{
return (tempValue > 0)
}
else
{
return false;
}