如何将三个重载的BasicLog扩展方法合并为单一通用方法?
合并C#整数类型扩展方法的可行方案
当然可以合并这三个重复的扩展方法,以下是几种实用方案,按推荐程度排序:
1. 最优方案:使用C# 11+的INumber<T>泛型接口(.NET 7及以上)
利用.NET 7引入的INumber<T>接口,它统一了所有数值类型的公共行为,能安全覆盖int、long、short等整数类型,同时保留编译时类型检查:
internal static void BasicLog<T>(this T logData) where T : struct, INumber<T> => CreateSystemLog(Type.BasicLog, logData.ToString());
如果需要严格限制仅支持整数类型,可替换为IIntegerNumber<T>接口,进一步缩小适用范围。
2. 兼容低版本C#的泛型方案(C# 10及以下,.NET 6及更早)
如果项目无法升级到高版本框架,可通过泛型+值类型约束+手动类型校验实现:
internal static void BasicLog<T>(this T logData) where T : struct, IFormattable { var type = typeof(T); if (type != typeof(int) && type != typeof(long) && type != typeof(short)) throw new ArgumentException("仅支持int、long、short类型"); CreateSystemLog(Type.BasicLog, logData.ToString(null, null)); }
这种方式需要手动校验传入类型,避免非目标值类型被误用。
3. 不推荐的动态类型方案
虽然可以用dynamic快速实现,但会失去编译时类型检查,运行时才会暴露类型错误,仅适合临时场景:
internal static void BasicLog(this dynamic logData) => CreateSystemLog(Type.BasicLog, logData.ToString());
内容的提问来源于stack exchange,提问作者Tom Gullen
相关产品推荐
相关产品推荐

