Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to dynamically get a property by name from a C# ExpandoObject?

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.

like image 891
user2838966 Avatar asked Oct 02 '13 14:10

user2838966


People also ask

How to get class property value dynamically in c#?

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.

What does dynamic expose to c#?

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.


1 Answers

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;
like image 118
Marc Gravell Avatar answered Oct 19 '22 11:10

Marc Gravell