如何用动态数据类型简化TryParse多类型判断逻辑?
可行,通过反射可以实现动态调用对应类型的TryParse方法
你完全可以去掉那些if分支,利用反射动态查找并调用目标类型的TryParse静态方法,核心思路是:
- 先处理可空类型(比如
decimal?),提取其底层的非可空类型 - 反射查找该类型的
TryParse(string, out T)静态方法 - 动态调用这个方法并返回结果
下面是修改后的ValidateDataType方法实现:
private bool ValidateDataType(PropertyInfo propInfo, string dataElement) { if (propInfo is null) return true; // 处理可空类型,获取底层非可空类型 Type targetType = Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType; // 查找TryParse方法:参数为(string, out T),返回bool的静态方法 MethodInfo tryParseMethod = targetType.GetMethod( "TryParse", new[] { typeof(string), targetType.MakeByRefType() }); if (tryParseMethod == null) { // 如果该类型没有TryParse方法,按验证不通过处理,可根据业务需求调整逻辑 return false; } // 准备参数:第一个是输入字符串,第二个是out参数的占位(值类型默认初始化) object[] parameters = { dataElement, Activator.CreateInstance(targetType) }; // 调用TryParse方法,返回结果 bool result = (bool)tryParseMethod.Invoke(null, parameters); return result; }
注意事项
- 该实现仅适用于拥有
TryParse(string, out T)标准签名的类型(比如int、decimal、DateTime、bool等常用值类型),如果遇到自定义类型没有该方法的情况,需要额外处理(比如返回false或抛出异常,根据你的业务需求调整) - 代码已自动处理可空类型的底层类型提取,无需单独判断
Nullable<T> - 性能方面:反射调用会比直接写if分支略慢,但如果数据量不是特别巨大,这种性能差异可以忽略;若追求极致性能,可考虑缓存每个类型的TryParse方法,避免每次反射查找
内容的提问来源于stack exchange,提问作者LUAN-I JACKSON
相关产品推荐
相关产品推荐

