C#中如何将int、decimal解析方法合并为通用泛型方法
泛型数值解析方法合并实现
你可以直接通过泛型约束合并两个重复的解析逻辑,不需要修改原有调用的异常处理规则,以下是两种适配不同.NET版本的实现:
.NET 7+ 最优实现
.NET 7 开始所有基础数值类型都实现了内置的ISpanParsable<T>泛型接口,直接用接口约束写泛型方法即可,没有额外性能开销,还能自动支持long、float、double等所有标准数值类型:
using System.Numerics; private T ParseNumericField<T>(string value, int linecount, string fieldName) where T : ISpanParsable<T> { if (!T.TryParse(value, provider: null, out T result)) { throw new Exception($"TryParse failed, line {linecount} Fieldname: {fieldName} Value: {value}"); } return result; }
调用方式和原有方法完全兼容,直接指定泛型类型即可替换原有调用:
// 替换原ParseIntField调用 int intValue = ParseNumericField<int>(rawValue, currentLine, "UserId"); // 替换原ParseDecimalField调用 decimal decimalValue = ParseNumericField<decimal>(rawValue, currentLine, "OrderAmount");
.NET 6及以下低版本兼容实现
如果你的项目用的是低于.NET7的版本,没有ISpanParsable接口,可以通过类型分支判断实现,逻辑和你原来的独立方法完全一致:
private T ParseNumericField<T>(string value, int linecount, string fieldName) { bool parseSuccess = false; object parseResult = default(T); switch (Type.GetTypeCode(typeof(T))) { case TypeCode.Int32: parseSuccess = int.TryParse(value, out int intRes); parseResult = intRes; break; case TypeCode.Decimal: parseSuccess = decimal.TryParse(value, out decimal decRes); parseResult = decRes; break; // 如需支持其他数值类型,在这里加对应分支即可 default: throw new NotSupportedException($"当前方法不支持解析{typeof(T).Name}类型"); } if (!parseSuccess) { throw new Exception($"TryParse failed, line {linecount} Fieldname: {fieldName} Value: {value}"); } return (T)parseResult; }
说明
- 两种实现的错误抛出逻辑和你原有独立方法完全一致,上层异常捕获代码不需要做任何修改
- 如果需要适配特定区域的数字格式(比如带千分位、货币符号的数值),只需要给
TryParse方法传入对应的IFormatProvider参数即可 - 高版本实现没有装箱拆箱开销,性能和你手写的两个独立方法基本无差异
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

