Improving performance reflection - what alternatives should I consider?
I need to dynamically set values on a bunch or properties on an object, call it a transmission object.
There will be a fair number of these transmission objects that will be created and have its properties set in a short space of time. I want to avoid the use of reflection.
Are there alternatives? If so are there sample implementations I could look at?
Use Delegate.CreateDelegate
to turn a MethodInfo
into a strongly-typed delegate. This can improve performance massively. I have a blog post about this with sample code. Note that this is only going to help if you need to set the same properties multiple times - basically it means that a lot of the type checking is done once when you create the delegate, rather than on every invocation.
Marc Gravell has a HyperPropertyDescriptor project which achieves even better performance, but introduces an extra dependency. This project became the jumping off point for the more modern Fast Member (github). In general you would use Fast Member over HyperProperty.
In .NET 4.0 (beta), you can do this with the updated expression trees, using Expression.Block
and Expression.Assign
- then compile that to a typed delegate; job done.
In .NET 2.0 and above (as Jon mentioned) HyperDescriptor is a reasonable option - it works as a custom PropertyDescriptor
implementation, so you just do code like:
// store this collection for optimum performance
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(
typeof(SomeType));
props["Name"].SetValue(obj, newName);
props["DateOfBirth"].SetValue(obj, newDoB);
This still has a little boxing, but that isn't actually a bottleneck.
Reflection can be blazingly fast if you do it right (not as fast as static code, of course).
Finding a property-setter is slow. Invoking a delegate is fast.
You need to get and cache Delegate
objects for each property-setter on each type of DTO. That's the slow part, but it's a one-time hit. Then you can Invoke
each of the cached delegates for the property-setters of a given DTO type, passing in the DTO object and the new property value, but this part will be very fast.