Best way to cache a reflection property getter / s

2019-03-12 22:32发布

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?

4条回答
仙女界的扛把子
2楼-- · 2019-03-12 22:40

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

查看更多
够拽才男人
3楼-- · 2019-03-12 22:45

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.

查看更多
Animai°情兽
4楼-- · 2019-03-12 22:56

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

查看更多
姐就是有狂的资本
5楼-- · 2019-03-12 22:59

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

typeof(T).GetProperty(propName)
查看更多
登录 后发表回答