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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:17:24