I know that Reflection can be expensive. I have a class that gets/sets to properties often, and one way I figured was to cache the reflection somehow. I'm not sure if I'm supposed to cache an expression or what to do here really. This is what I'm currently doing:
typeof(T).GetProperty(propName).SetValue(obj, value, null);
typeof(T).GetProperty(propName).GetValue(obj, null);
So... what would be the best way to make this quicker?
Marc Gravell has written a brilliant article about his HyperDescriptor. It should provide a much faster runtime reflective property access.
Well, the simplest answer is that you could cache the
PropertyInfo
object returned byGetProperty
:That would eliminate the need for Reflection to repeatedly find the property in the class and eliminate the bulk of the performance hit.
You should cache results of
and
Another possible approach is to combine PropertyInfo.GetGetMethod Method (or PropertyInfo.GetSetMethod Method for setter) with Delegate.CreateDelegate Method and invoke the resulting delegate every time you need to get/set values. If you need this to work with generics you can use approach from this question: CreateDelegate with unknown types
This should be much faster compared to reflection: Making reflection fly and exploring delegates
There are also other ways to get/set values in a faster way. You can use expression trees or DynamicMethod to generate the il at runtime. Have a look at these links:
Late-Bound Invocations with DynamicMethod
Delegate.CreateDelegate vs DynamicMethod vs Expression
Just store a reference to the
PropertyInfo
that is returned from: