Я хотел бы знать, есть ли "безопасный" способ конвертировать объект в int, исключая исключения.
Я ищу что-то вроде public static bool TryToInt32 (значение объекта, out int result);
Я знаю, что могу сделать что-то вроде этого:
public static bool TryToInt32(object value, out int result)
{
try
{
result = Convert.ToInt32(value);
return true;
}
catch
{
result = 0;
return false;
}
}
Но я предпочитаю избегать исключений, потому что они замедляют процесс.
Я думаю, что это более элегантно, но все равно "дешево".
public static bool TryToInt32(object value, out int result)
{
if (value == null)
{
result = 0;
return false;
}
return int.TryParse(value.ToString(), out result);
}
У кого-нибудь есть идея лучше?
UPDATE:
Это звучит немного как расщепление поиска волос. Но преобразование объекта в строку заставляет разработчика создавать четкую функцию ToString().
например:
public class Percentage
{
public int Value { get; set; }
public override string ToString()
{
return string.Format("{0}%", Value);
}
}
Percentage p = new Percentage();
p.Value = 50;
int v;
if (int.TryParse(p.ToString(), out v))
{
}
Это не так, я могу сделать две вещи здесь, или реализовать IConvertable, как показано ниже.
public static bool ToInt32(object value, out int result)
{
if (value == null)
{
result = 0;
return false;
}
if (value is IConvertible)
{
result = ((IConvertible)value).ToInt32(Thread.CurrentThread.CurrentCulture);
return true;
}
return int.TryParse(value.ToString(), out result);
}
Но ToInt32 IConvertible не может быть отменен. Поэтому, если это невозможно, исключение нельзя избежать.
или два: есть ли способ проверить, содержит ли объект неявный оператор?
Это очень плохо:
if (value.GetType().GetMethods().FirstOrDefault(method => method.Name == "op_Implicit" && method.ReturnType == typeof(int)) != null)
{
result = (int)value;
return true;
}