我想知道是否有一种“安全”的方法可以将对象转换为int
,避免异常。
我正在寻找类似的东西public static bool TryToInt32(object value, 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);
}
有没有人有更好的想法?
更新:
这听起来有点像扯头发,但是将对象转换为字符串会强制实现者创建一个清晰的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;
}