运行时基于.NET类型字符串验证对象类型的实现方法
运行时通过类型名字符串验证值的类型匹配
核心思路
先通过反射从类型名字符串获取目标Type对象,再分两种场景判断:
- 值的类型直接匹配目标类型(或可赋值给目标类型)
- 值可以安全转换为目标类型(比如字符串转数值类型的场景)
实现代码
using System.ComponentModel; public static bool IsValueMatchingExpectedType(string expectedDataType, object givenValue) { // 从类型名字符串获取目标Type Type targetType = Type.GetType(expectedDataType); if (targetType == null) throw new ArgumentException("无效的类型名称", nameof(expectedDataType)); // 处理值为null的情况:仅当目标类型是引用类型或可空值类型时合法 if (givenValue == null) return !targetType.IsValueType || Nullable.GetUnderlyingType(targetType) != null; // 检查值的类型是否可直接赋值给目标类型 if (targetType.IsAssignableFrom(givenValue.GetType())) return true; // 尝试验证值是否可转换为目标类型 try { TypeConverter converter = TypeDescriptor.GetConverter(targetType); return converter.IsValid(givenValue); } catch { return false; } }
代码说明
- 获取目标类型:使用
Type.GetType(expectedDataType),系统类型需传入完整命名空间(如System.Int32),自定义类型需带上程序集限定名(如MyApp.Models.User, MyApp)。 - null值处理:如果传入的
givenValue是null,只有当目标类型是引用类型(如string)或可空值类型(如int?)时才返回true,避免向不可空值类型赋值null的错误。 - 直接类型匹配:用
IsAssignableFrom检查值的类型是否与目标类型兼容(比如子类对象赋值给父类类型的场景)。 - 类型转换验证:借助
TypeConverter的IsValid方法,安全判断值是否能转换为目标类型——比如你的示例中"123 Not An Int32"无法转换为int,会返回false;而"123"则会返回true。
测试你的场景
string expectedDataType = "System.Int32"; object givenValue = "123 Not An Int32"; bool result = IsValueMatchingExpectedType(expectedDataType, givenValue); // result = false,符合预期
补充说明
- 如果只需要严格匹配类型(不允许转换),可以删除类型转换验证的代码块,仅保留直接类型检查和null处理逻辑。
- 对于自定义类型,若需要支持特定转换逻辑,可以实现自定义
TypeConverter并注册。
内容的提问来源于stack exchange,提问作者LonelySemiColon
相关产品推荐
相关产品推荐

