Get the name of a property as a string in C#
Another developer showed me something very useful with Expression Trees in C# (thanks, Pierre! Full credit goes to you). To show you the awesomeness of it all, let's start with a class called Person.
Now let's say I have an instance of Person
Imagine creating a Dictionary<string,string> of this particular Person's properties (e.g. "Name" and "Email") and the corresponding property values.
We could easily do something like the following:
But there is unnecessary redundancy and repetition in this. We have to say the property twice (and as a messy string no less!).
Well, we could use reflection...
...but a lot of developers seem scared by Reflection & especially a concise statement like the above.
Below is a way to get the Property name & value in one small statement while keeping a strong typed non-reflective code base.
We just need to create a new Method...
And now just call each property as a Func<T>...
Personally, I like the reflective way but I thought this was a very good use case for an Expression Tree
public class Person
{
public string Name { get; set; }
public string Email { get; set; }
}
Now let's say I have an instance of Person
var person = new Person
{
Name = "mark kockerbeck",
Email = "noneofyourbusiness@face.com",
};
Imagine creating a Dictionary<string,string> of this particular Person's properties (e.g. "Name" and "Email") and the corresponding property values.
We could easily do something like the following:
var dictionary = new Dictionary<string, string>
{
{ "Name", person.Name },
{ "Email", person.Email },
};
But there is unnecessary redundancy and repetition in this. We have to say the property twice (and as a messy string no less!).
Well, we could use reflection...
var dictionary = new Dictionary<string, string>();
typeof(Person).GetProperties().ToList().ForEach(p => dictionary.Add(p.Name, p.GetValue(person, null).ToString()));
...but a lot of developers seem scared by Reflection & especially a concise statement like the above.
Below is a way to get the Property name & value in one small statement while keeping a strong typed non-reflective code base.
We just need to create a new Method...
public static void AddField<T>(Dictionary<string,T> dictionary, Expression<Func<T>> expression)
{
var name = ((MemberExpression)expression.Body).Member.Name;
dictionary.Add(name, expression.Compile()());
}
And now just call each property as a Func<T>...
var dictionary = new Dictionary<string, string>();
AddField(dictionary, () => person.Name);
AddField(dictionary, () => person.Email);
Personally, I like the reflective way but I thought this was a very good use case for an Expression Tree
Comments