While using an ExpandoObject
it might look like you can add properties at runtime, it won't actually do that at the CLR level. That's why using reflection to get the property you added at runtime won't work.
It helps to think of an ExpandoObject
as a dictionary mapping strings to objects. When you treat an ExpandoObject
as a dynamic
variable any invocation of a property gets routed to that dictionary.
dynamic exp = new ExpandoObject();
exp.A = "123";
The actual invocation is quite complex and involves the DLR, but its effect is the same as writing
((IDictionary<string, object>)exp)["A"] = "123";
This also only works when using dynamic
. A strongly typed version of the code above results in a compile-time error.
var exp = new ExpandoObject();
exp.A = "123"; // compile-time error
The actual implementation of ExpandoObject
can be found here.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…