泛型转换场景下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
相关产品推荐
相关产品推荐

