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

C#中使用Reflection通过PropertyInfo.SetValue修改Task属性值的疑问

解决反射修改Task属性值的问题

嗨,这个问题其实很直观——PropertyInfo.SetValue的第一个参数就是你要修改属性的目标实例,也就是你的viewBinding对象本身!

为什么是viewBinding?

你是通过viewBinding.GetType().GetProperty(...)拿到的viewBindingProperty,这个属性是属于viewBinding这个实例的,所以修改它的值时,必须把这个实例传给SetValue,告诉反射“我要修改这个对象上的这个属性”。如果是静态属性,才需要传null,但你的场景显然是实例属性。

修正后的完整代码

// 获取Task类型的属性(注意:用typeof(Task).Name可能有坑,泛型Task<T>的Name会是"Task`1",建议用类型匹配更稳妥)
var viewBindingProperty = viewBinding.GetType().GetProperties()
    .FirstOrDefault(p => p.PropertyType == typeof(Task));

// 先做null检查,避免空引用异常,同时确认属性可写
if (viewBindingProperty != null && viewBindingProperty.CanWrite)
{
    // 第一个参数传viewBinding(目标实例),第二个参数是要设置的新值
    viewBindingProperty.SetValue(viewBinding, pageBinding.Task);
}

额外注意事项

  • 用typeof(Task).Name匹配属性名有风险:如果属性是泛型Task<T>,Name会返回"Task1",这时候就匹配不到了。更可靠的方式是直接匹配属性类型——如果是普通Task就用p.PropertyType == typeof(Task),如果是泛型任务可以用p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(Task<>)`。
  • 必须检查viewBindingProperty是否为null,以及属性是否可写(CanWrite为true),否则会抛出空引用或参数异常。

内容的提问来源于stack exchange,提问作者Bad Dub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:00:42