It depends on what do you want to clone and why. If a shallow clone is fine, then:
private static T CloneShallow<T>(T i) {
return
(T)i.GetType()
.GetMethod(
"MemberwiseClone",
BindingFlags.Instance | BindingFlags.NonPublic
).Invoke(i, null);
}
It's the fastest way to clone simple records of any type.
If you need full copy, but it's not time-critical, then:
private static T CloneFull<T>(T i) {
if (Object.ReferenceEquals(i, null)) return default(T);
var x = new XmlSerializer(i.GetType());
using (var m = new MemoryStream()) {
x.Serialize(m, i);
m.Seek(0, SeekOrigin.Begin);
return (T)x.Deserialize(m);
}
}
The second one is about 70 times slower than the first one.
If you need full copy and the speed is important, consider using protobuf-net as serializer.
There's a lot of answers involving modification of the object you wish to clone, but often you just need to clone a simple record and you don't want to implement anything on it.
And if you wonder how slow CloneFull() is - on my computer (i5 661 @ 3.33GHz) with very simple record it took 360 ticks, which gives 36ns. Which is fast enough in most cases :)