How to deep copy between objects of different types in C#.NET
What version of .NET is it?
For shallow copy:
In 3.5, you can pre-compile an Expression
to do this. In 2.0, you can use HyperDescriptor
very easily to do the same. Both will vastly out-perform reflection.
There is a pre-canned implementation of the Expression
approach in MiscUtil
- PropertyCopy
:
DestType clone = PropertyCopy<DestType>.CopyFrom(original);
(end shallow)
BinaryFormatter (in the question) is not an option here - it simply won't work since the original and destination types are different. If the data is contract based, XmlSerializer or DataContractSerializer would work if all the contract-names match, but the two (shallow) options above would be much quicker if they are possible.
Also - if your types are marked with common serialization attributes (XmlType
or DataContract
), then protobuf-net can (in some cases) do a deep-copy / change-type for you:
DestType clone = Serializer.ChangeType<OriginalType, DestType>(original);
But this depends on the types having very similar schemas (in fact, it doesn't use the names, it uses the explicit "Order" etc on the attributes)
As an alternative to using reflection every time, you could create a helper class which dynamically creates copy methods using Reflection.Emit - this would mean you only get the performance hit on startup. This may give you the combination of flexibility and performance that you need.
As Reflection.Emit is quite clunky, I would suggest checking out this Reflector addin, which is brilliant for building this sort of code.