I want to be able to access property values in an object like a dictionary, using the name of the property as a key. I don\'t really care if the values are returned as objec
I have this extension method, probably the simplest it can get:
public static Dictionary ToPropertyDictionary(this object obj)
{
var dictionary = new Dictionary();
foreach (var propertyInfo in obj.GetType().GetProperties())
if (propertyInfo.CanRead && propertyInfo.GetIndexParameters().Length == 0)
dictionary[propertyInfo.Name] = propertyInfo.GetValue(obj, null);
return dictionary;
}
Now you can do:
object person = new { Name = "Bob", Age = 45 };
var lookup = person.ToPropertyDictionary();
string name = (string)lookup["Name"];
lookup["Age"] = (int)lookup["Age"] + 1; // indeed editable
Note:
that this dictionary is case-sensitive (you can trivially extend it passing the right StringComparer).
that it ignores indexers (which are also properties) but it's up to you to work on it.
that the method is not generic considering it doesn't help boxing because internally it calls obj.GetType, so it boxes anyway at that point.
that you get only the "readable" properties (otherwise you dont get the values held in it). Since you want it to be "writable" as well then you should use CanWrite flag as well.