MemberwiseClone() seems to work great for this since you can define it in the base class and all inherited types can use it. This would be the answer and I'd be done, but it allocates a clone rather than copies to a provided pooled object. Is there a similar way to do this while remaining AoT compatible?