0

.NETforWindowsストアアプリを使用して複数化フレームワークを作成しています。カスタムフォーマッターstring Format(string format, params object[] args)の場合、次のコードがあります。

public static bool IsExactlyOne(object n)
{
    if (n is Int16)
    {
        return (Int16)n == 1;
    }
    if (n is int) // Int32
    {
        return (int)n == 1;
    }
    if (n is long) // Int64
    {
        return (long)n == 1L;
    }
    if (n is UInt16)
    {
        return (UInt16)n == 1U;
    }
    if (n is uint) // UInt32
    {
        return (uint)n == 1U;
    }
    if (n is ulong) // UInt64
    {
        return (ulong)n == 1UL;
    }
    if (n is byte)
    {
        return (byte)n == 1;
    }
    if (n is sbyte)
    {
        return (sbyte)n == 1;
    }
    if (n is float)
    {
        return (float)n == 1.0F;
    }
    if (n is double)
    {
        return (double)n == 1.0D;
    }
    if (n is decimal)
    {
        return (decimal)n == 1.0M;
    }

    throw new ArgumentException("Unsupported type");
}

ご覧のとおり、かなり冗長です。これを単純化する方法はありますか?注意:Windowsストアアプリでは利用できIConvertibleません。

4

4 に答える 4

2

辞書を使用して回避するのはどうですかif

var dic = new Dictionary<Type, Func<object, bool>>()
                    {
                        {typeof(Int16), a => (Int16)a == 1},
                        {typeof(int), a => (int)a == 1},
                         ....
                    };

return dic[n.GetType()](n);

または使用dynamic

public static bool IsExactlyOne(dynamic n)
{
    return n == 1;
}         
于 2013-01-31T11:05:08.867 に答える
1

これは問題なく機能するはずです。

    bool IsExactlyOne(object n)
    {
        int i;
        int.TryParse(n.ToString(), out i);
        return i == 1;
    }

OPのバージョンにすでに存在する問題である1.000000000000001のような高精度の数値を処理する場合を除きます。

高精度に対処する唯一の方法は、小数を明示的に使用することです。

于 2013-01-31T11:16:58.370 に答える
-1

そこに行きます:

public static bool IsExactlyOne(object n)
{
bool result = false;
try
{
result = Convert.ToDouble(n) == 1.0;
}
catch
{
}
return result;
}
于 2013-01-31T11:08:35.357 に答える
-1

ここで受け入れられた答えを見てください。

string value = "123.3";
double num;
if (!double.TryParse(value, out num))
  throw new InvalidOperationException("Value is not a number.");
于 2013-01-31T11:09:12.097 に答える