62

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.

2 Answers 2

116

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;
Sign up to request clarification or add additional context in comments.

Comments

3

You can use an extension method to do what you need:

public static T Get<T>(this ExpandoObject expO, string prop)
{
    return (T)((IDictionary<string, object>)expO)[prop];
}

Example usage:

account.features.Get<bool>("isEmailEnabled");

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.