55

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;
}
4

7 に答える 7

57
int variable = 0;
int.TryParse(stringValue, out variable);

解析できない場合、変数は 0 になります。http://msdn.microsoft.com/en-us/library/f02979c7.aspx を参照してください。

于 2013-08-14T09:01:34.003 に答える
5

ここで車輪を再発明する必要はありません。int.TryParseを使用して目標を達成してください。値が解析されているかどうかを示すブール値を返します。解析された場合、結果は出力変数に保存されます。

int result;
object a = 5;
if(int.TryParse(a.ToString(),out result))
{
   Console.WriteLine("value is parsed");  //will print 5
}    

object b = a5;
if(int.TryParse(b.ToString(),out result))
{
    Console.WriteLine("value is parsed");  
}
else
{
    Console.WriteLine("input is not a valid integer");  //will print this   
}
于 2013-08-14T09:02:08.000 に答える
1

私はこの混乱を書きました、それを見ると悲しくなります。

using System;
using System.Globalization;

internal static class ObjectExt
{
    internal static bool TryConvertToDouble(object value, out double result)
    {
        if (value == null || value is bool)
        {
            result = 0;
            return false;
        }

        if (value is double)
        {
            result = (double)value;
            return true;
        }

        var text = value as string;
        if (text != null)
        {
            return double.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture, out result);
        }

        var convertible = value as IConvertible;
        if (convertible == null)
        {
            result = 0;
            return false;
        }

        try
        {
            result = convertible.ToDouble(CultureInfo.InvariantCulture);
            return true;
        }
        catch (Exception)
        {
            result = 0;
            return false;
        }
    }
}

編集通知今、私は質問がintのときに二重に答え、とにかくそのままにしました。多分誰かのために役立つ。

于 2016-09-16T15:23:05.103 に答える