C#如何实现可接收任意类型输入、自动转存为字符串的Setter?
完全不需要为每个类型单独定义重载,两种精简方案就能覆盖所有需求:
方案1:单方法统一处理(最简单,适合绝大多数场景)
所有入参统一用object类型接收,利用C#类型匹配和接口特性批量处理数值类型:
public string TargetValue { get; set; } public void SetValue(object input) { if (input == null) { TargetValue = string.Empty; return; } TargetValue = input switch { string str => str, DateTime date => date.ToString(), // 默认使用当前线程区域规则输出,可自行传入CultureInfo调整 bool boolean => boolean.ToString().ToLower(), // 要小写"true"/"false"就加ToLower,不需要直接删除 IFormattable formattableVal => formattableVal.ToString(null, System.Globalization.CultureInfo.CurrentCulture), _ => input.ToString() }; }
所有C#数值类型(int/uint/long/ulong/float/double/decimal等)都实现了IFormattable接口,这一个分支就能覆盖全部数值类型,完全不用逐个判断,整套逻辑加起来不到20行,没有任何冗余代码。
方案2:泛型实现(避免装箱,性能更优)
如果不想用object导致值类型装箱损耗性能,可以写泛型方法实现,还是只需要一个方法:
public void SetValue<T>(T input) { if (input == null) { TargetValue = string.Empty; return; } TargetValue = typeof(T) switch { Type t when t == typeof(string) => input as string, Type t when t == typeof(DateTime) => ((DateTime)(object)input).ToString(), Type t when t == typeof(bool) => ((bool)(object)input).ToString(), Type t when t.IsPrimitive && t.IsValueType || t == typeof(decimal) => ((IFormattable)input).ToString(null, System.Globalization.CultureInfo.CurrentCulture), _ => input.ToString() }; }
如果后续有特殊场景需要对某个特定类型做定制转换,再单独加对应类型的重载即可,C#重载调用优先级高于泛型方法,完全不会冲突。
内容的提问来源于stack exchange,提问作者Nik Volk
相关产品推荐
相关产品推荐

