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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:12:04