Reputation: 15282
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?
Upvotes: 15
Views: 14507
Reputation: 30873
You should cache results of
typeof(T).GetProperty(propName);
and
typeof(T).GetProperty(propName);
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
Upvotes: 14
Reputation: 55946
Marc Gravell has written a brilliant article about his HyperDescriptor. It should provide a much faster runtime reflective property access.
Upvotes: 3
Reputation: 3289
Well, the simplest answer is that you could cache the PropertyInfo
object returned by GetProperty
:
var propInfo = typeof(T).GetProperty(propName);
propInfo.SetValue(obj, value, null);
propInfo.GetValue(obj, null);
// etc.
That would eliminate the need for Reflection to repeatedly find the property in the class and eliminate the bulk of the performance hit.
Upvotes: 4
Reputation: 37506
Just store a reference to the PropertyInfo
that is returned from:
typeof(T).GetProperty(propName)
Upvotes: 2