Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to cache a reflection property getter / setter?

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?

like image 210
michael Avatar asked Nov 03 '11 17:11

michael


2 Answers

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

like image 65
Giorgi Avatar answered Sep 20 '22 11:09

Giorgi


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.

like image 28
Jeremy Todd Avatar answered Sep 19 '22 11:09

Jeremy Todd