0

我正在使用 .NET 为 Windows Store 应用程序编写一个多元化框架。对于自定义格式化程序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");
}

如您所见,它非常冗长。有什么方法可以简化这个吗?请注意:IConvertible不适用于Windows 应用商店应用程序。

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

除非在处理像 1.000000000000001 这样的高精度数字时,这是 OP 版本中已经存在的问题。

处理高精度的唯一方法是显式使用小数。

于 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 回答