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

泛型转换场景下ToLocalTime方法失效问题排查与修复求助

问题原因
  • 核心错误是类型判断逻辑有误:prop是System.Reflection.PropertyInfo类的实例,调用prop.GetType()返回的永远是typeof(PropertyInfo),不可能匹配typeof(DateTime)/typeof(DateTime?),导致时间转换分支永远不会执行,这是转换失败的根本原因,你需要通过prop.PropertyType才能获取属性本身的实际类型。
  • 多余的权限校验:你仅需要读取属性值,不需要判断prop.CanWrite,该判断会导致所有只读属性直接返回空字符串,不符合方法的设计目标。
  • 存在潜在异常风险:如果属性值为null,最后的ToString()调用会直接抛出空引用异常;且将double直接强转decimal存在精度丢失风险。
修复后的完整代码
/// <summary>
/// 根据属性名获取对象的属性值,返回格式化后的字符串
/// </summary>
/// <param name="obj">目标对象</param>
/// <param name="name">属性名称</param>
/// <param name="format">输出格式化字符串(可选)</param>
public static string GetByNameFormatted(this Object obj, string name, string format = "")
{
    // 增加入参空校验
    if (obj == null) return string.Empty;
    PropertyInfo prop = obj.GetType().GetProperty(name, BindingFlags.Public | BindingFlags.Instance);
    // 移除不必要的CanWrite判断,读取属性不需要写权限
    if (null == prop) return string.Empty;

    object value = prop.GetValue(obj, null);
    if (value == null) return string.Empty;

    // 用prop.PropertyType获取属性的实际类型
    if (prop.PropertyType == typeof(DateTime))
    {
        DateTime val = (DateTime)value;
        DateTime utc = DateTime.SpecifyKind(val, DateTimeKind.Utc);
        return utc.ToLocalTime().ToString("G");
    }

    if (prop.PropertyType == typeof(DateTime?))
    {
        DateTime val = ((DateTime?)value).Value;
        DateTime utc = DateTime.SpecifyKind(val, DateTimeKind.Utc);
        return utc.ToLocalTime().ToString("G");
    }

    if (prop.PropertyType == typeof(decimal))
    {
        return ((decimal)value).ToString(format);
    }
    
    if (prop.PropertyType == typeof(double))
    {
        return ((double)value).ToString(format);
    }

    return value.ToString();
}

内容的提问来源于stack exchange,提问作者Kylar182

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:15:03