I have an ExpandoObject
and want to make a getter for it that will return a property by name at runtime, where the name is specified in a string instead of hardcoded.
For example, I CAN do this:
account.features.isEmailEnabled;
and that will return true. account
is a ExpandoObject
, and features
is also an ExpandoObject
. So I have an ExpandoObject
that contains other ExpandoObjects
.
So what I want to be able to do is this:
account.features.GetProperty("isEmailEnabled");
and have that return true.
The reason is that I have many features, and I want to be able to write one generic getter method where I can pass in the name of the feature I want, and the method will pass me back the value for account.features.whatever (where "whatever" is specified by passing in a string to the generic getter method). Otherwise I am going to have to write 30-some getters one for each feature.
I did a lot of research and tried doing something like:
var prop = account.features.GetType();
// this returns System.Dyanmic.ExpandoObject
followed by
var value = prop.GetProperty(featureNameAsString);
but value
always comes back as null. I don't understand why. In the watch window I can do account.features.isEmailEnabled
and it shows true and says its a boolean. But if I try to get at this value using the approach above and pass in isEmailEnabled
as the featureNameAsString
I just get null.
Can someone please tell me what I may be doing wrong and what's a good approach, without it being too complex?
I am working with ASP.NET under the 4.5.1 framework.
In the above example we could see that the Employee properties values are set using Reflection by getting the type and property name. Similarly for fetching the property value we have used GetProperty() method of the Reflection class. By using this we can fetch the value of any property during the runtime.
Dynamic objects expose members such as properties and methods at run time, instead of at compile time. This enables you to create objects to work with structures that do not match a static type or format.
ExpandoObject
provides access both via dynamic
and via IDictionary<string,object>
- so you could just use the dictionary API:
var byName = (IDictionary<string,object>)account.features;
bool val = (bool)byName["isEmailEnabled"];
Or if the name is fixed, just:
bool val = ((dynamic)account).features.isEmailEnabled;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With