It all depends on the kind of cloning you want. If you want shallow cloning, it's easy enough. Looping through the properties of the object and setting them on the clone will do just that. But that means that properties containing references will reference the same object for both the source as the clone.
If you want a deep clone, you'll have to find a way to also clone references owned by the source object (and references owned by the references owned by the source, etc. etc.). This may not be possible to do in automated way, if those references don't have default constructors.
What it boils down to is that, in my experience, if you have a non-trivial class and/or class hierarchy (notably with the possibility of not-existing default constructors), the easiest, most reliable way, is to just write either a "copy constructor" (which doesn't exists as such in .NET), and do the work yourself, implement ICloneable
, and do the work yourself, or implement your own kind of Clone method, and do the work yourself ;)