C#使用反射修改模型类属性名时出现空引用异常如何解决
问题排查
你遇到的空引用报错:
Object Reference not set to an instance of an object
由两个核心问题共同触发:
- 你实例化
Example1后没有给Property1属性赋值,myProperties.Property1默认是null,调用myProperties.Property1.Fruit本身就会触发空引用异常 - 反射方法的传参逻辑完全错误:
- 你要修改的是
Property1类的Fruit属性,所以反射方法的第一个入参应该是myProperties.Property1实例,而不是Example1实例,Example1类本身根本没有名为Fruit的属性,所以GetProperty方法会返回null,调用property.SetValue自然会报错 - 反射方法的第二个入参需要是字符串形式的属性名
"Fruit",而你传的是myProperties.Property1.Fruit的运行时值,完全不符合参数要求
- 你要修改的是
修正方案
首先修正实例化逻辑,初始化Property1属性:
var firstName = "Car"; Example1 myProperties = new Example1() { Property1 = new Property1() };
然后修正反射方法调用逻辑:
SetPropertyValue(myProperties.Property1, "Fruit", firstName);
执行后myProperties.Property1.Fruit的值就会被设置为"Car"。
额外说明
如果你的真实需求是修改类定义中的属性名称,把Fruit改成Car,C#作为静态编译型语言不支持运行时修改已定义类的元数据结构:
- 如果是需要序列化/反序列化时用别名,可以给属性加对应序列化特性实现
- 如果需要运行时动态增减属性,可以使用
ExpandoObject等动态类型实现
内容的提问来源于stack exchange,提问作者MarkCo
相关产品推荐
相关产品推荐

