将泛型参数传递给非泛型方法
本文关键字:泛型方法 参数传递 泛型 | 更新日期: 2023-09-27 18:34:53
我正在尝试创建一个将空值舍入到给定小数位的方法。 理想情况下,我希望这是一个通用的,这样我就可以在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)'
}
如何实现这一点?
就个人而言,我会摆脱您的通用方法。无论如何,它只对两个类型的参数有效 - 将其拆分为具有两个重载的重载方法:
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 的答案有条件地调用它,直接使用反射调用它,或者如果使用 C# 4 和 .NET 4,则使用 dynamic
。
假设您已经在进行类型检查,只需在代码流中使用它:
if (paramType == typeof(decimal?))
...
Math.Round((decimal)nullable.Value, decimals)
else if(paramType == typeof(double?))
Math.Round((double)nullable.Value, decimals)