3

我正在尝试创建一种将可空值四舍五入到给定小数位的方法。理想情况下,我希望这是一个通用的,以便我可以在Math.Round()允许的情况下将它与双精度和小数一起使用。

我在下面编写的代码将无法编译,因为无法(可以理解地)解析该方法,因为无法知道要调用哪个重载。这将如何实现?

internal static T? RoundNullable<T>(T? nullable, int decimals) where T : struct
{
    Type paramType = typeof (T);

    if (paramType != typeof(decimal?) && paramType != typeof(double?))
        throw new ArgumentException(string.Format("Type '{0}' is not valid", typeof(T)));

    return nullable.HasValue ? Math.Round(nullable.Value, decimals) : (T?)null; //Cannot resolve method 'Round(T, int)'
 }
4

2 回答 2

7

这将如何实现?

就个人而言,我会摆脱你的通用方法。无论如何,它仅对两个类型参数有效 - 将其拆分为具有两个重载的重载方法:

internal static double? RoundNullable(double? nullable, int decimals)
{
    return nullable.HasValue ? Math.Round(nullable.Value, decimals)
                             : (double?) null;
}

internal static decimal? RoundNullable(decimal? nullable, int decimals)
{
    return nullable.HasValue ? Math.Round(nullable.Value, decimals)
                             : (decimal?) null;
}

如果您必须使用通用版本,请根据 Dave 的回答有条件地调用它,直接使用反射调用它,或者dynamic在使用 C# 4 和 .NET 4 时使用。

于 2012-05-21T09:50:33.130 回答
2

鉴于您已经在进行类型检查,只需在代码流中使用它:

if (paramType == typeof(decimal?))
...
    Math.Round((decimal)nullable.Value, decimals)
else if(paramType == typeof(double?))
    Math.Round((double)nullable.Value, decimals)
于 2012-05-21T09:50:11.533 回答