Json反序列化MyComponent时触发ArgumentNullException问题求助
问题分析与解决方案
异常根源
你遇到的ArgumentNullException是因为**Attribute.IsDefined收到了null的MemberInfo参数**。在反序列化过程中,OnPropertyChanged可能接收到e.PropertyName为null,或是当前类型不存在的属性名称,此时GetType().GetProperty(e.PropertyName)会返回null,而Attribute.IsDefined不允许第一个参数为null,直接触发了空引用异常。
修复方案
基础修复:增加空值检查
修改OnPropertyChanged方法,在调用反射相关方法前先做空值校验:
protected override void OnPropertyChanged(PropertyChangedEventArgs e) { // 先确保属性名有效且能找到对应的属性信息 if (!string.IsNullOrEmpty(e.PropertyName)) { PropertyInfo propertyInfo = GetType().GetProperty(e.PropertyName); if (propertyInfo != null && Attribute.IsDefined(propertyInfo, typeof(InspectableAttribute))) { HasBeenEdited = true; } } base.OnPropertyChanged(e); }
优化方案:缓存可追踪属性名
如果组件会频繁触发属性变更,建议提前缓存带InspectableAttribute的属性名,避免每次都做反射查询,提升性能:
public class MyComponent : ObservableObject { // 静态缓存带InspectableAttribute的属性名 private static readonly HashSet<string> _inspectablePropertyNames; static MyComponent() { _inspectablePropertyNames = typeof(MyComponent) .GetProperties() .Where(p => Attribute.IsDefined(p, typeof(InspectableAttribute))) .Select(p => p.Name) .ToHashSet(); } // 其余原有代码不变... protected override void OnPropertyChanged(PropertyChangedEventArgs e) { if (!string.IsNullOrEmpty(e.PropertyName) && _inspectablePropertyNames.Contains(e.PropertyName)) { HasBeenEdited = true; } base.OnPropertyChanged(e); } }
内容的提问来源于stack exchange,提问作者Thomas Slade
相关产品推荐
相关产品推荐

