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))
{
}
これはうまくいきません。ここで 2 つのことを行うか、次の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
キャンセルできません。したがって、値を変換できない場合、例外は避けられません。
または 2: オブジェクトに暗黙の演算子が含まれているかどうかを確認する方法はありますか?
これは非常に貧弱です:
if (value.GetType().GetMethods().FirstOrDefault(method => method.Name == "op_Implicit" && method.ReturnType == typeof(int)) != null)
{
result = (int)value;
return true;
}