C#无法向ExpandoObject添加动态键值,触发空引用异常
解决ExpandoObject空引用异常的问题
嘿,我一眼就揪出问题所在啦!
你看这段代码的核心问题:在GameAttributes的构造函数里,你确实创建了ExpandoObject并把它转成了IDictionary<string, string>,但你只是把这个实例存在了局部变量var Attribute里,完全没赋值给类的公共属性public IDictionary<string,string> Attribute { get; set; }。这就导致当你实例化GameAttributes后,gameAttributes.Attribute还是null,调用Add方法的时候自然就触发「对象引用未设置为对象的实例」异常了。
修正后的代码
只需要修改构造函数,把局部变量的赋值改成给类的属性赋值就行:
public class GameSet { public GameAttributes Attributes { get; set; } } public class GameAttributes { public GameAttributes () { dynamic expando = new ExpandoObject(); // 把局部变量改成给类的Attribute属性赋值 Attribute = expando as IDictionary<string,string>; } public IDictionary<string,string> Attribute { get; set; } } // 现在调用就不会报错了 var gameAttributes = new GameAttributes (); gameAttributes.Attribute.Add(OtherDataModelAttribute.name, OtherAttributeAttribute.value);
或者更简洁的写法,省去dynamic变量:
public class GameAttributes { public GameAttributes () { // 直接初始化属性 Attribute = new ExpandoObject() as IDictionary<string,string>; } public IDictionary<string,string> Attribute { get; set; } }
额外注意点
要提醒你:ExpandoObject本身实现的是IDictionary<string, object>,如果你强制转成IDictionary<string, string>,后续添加非string类型的值时会抛出类型转换异常。如果你的值可能不是string类型,建议把属性改成IDictionary<string, object>,或者确保所有要添加的value都是string类型。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

