I’m looking for a way to modify properties on a dynamic C# 4.0 object with the name of the property known only at runtime.
Is there a way to do something like (ExpandoObject is just used as an example, this could be any class that implements IDynamicMetaObjectProvider):
string key = "TestKey";
dynamic e = new ExpandoObject();
e[key] = "value";
Which would be equivalent to:
dynamic e = new ExpandoObject();
e.TestKey = "value";
Or is the only way forward reflection?
Not very easily, no. Reflection doesn’t work, since it assumes a regular type model, which is not the full range of
dynamic. If you are actually just talking to regular objects, then just use reflection here. Otherwise, I expect you may want to reverse-engineer the code that the compiler emits for a basic assignment, and tweak it to have a flexibly member-name. I’ll be honest, though: this isn’t an attractive option; a simple:translates to:
If you want an approach that works for both dynamic and non-dynamic objects: FastMember is handy for this, and works at either the type or object level:
available on Nuget, and heavily optimised for both dynamic and non-dynamic scenarios.