You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将三个重载的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:55:20