15

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?

michael
  • 14,844
  • 28
  • 89
  • 177

4 Answers4

14

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

Community
  • 1
  • 1
Giorgi
  • 30,270
  • 13
  • 89
  • 125
4

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.

Jeremy Todd
  • 3,261
  • 1
  • 18
  • 17
3

Marc Gravell has written a brilliant article about his HyperDescriptor. It should provide a much faster runtime reflective property access.

Paolo Moretti
  • 54,162
  • 23
  • 101
  • 92
2

Just store a reference to the PropertyInfo that is returned from:

typeof(T).GetProperty(propName)
wsanville
  • 37,158
  • 8
  • 76
  • 101