I think you can try the followings:
Retrieve the Type object of the object e.g. Type tp= o.GetType();
Now use tp.FindMembers() to find out the nonstatic fields.
If a field is a value type, then retrive MemberInfo about it and copy bit-by-bit this field in the output array.
If the field is a reference type, you decide to copy the reference only to the output array or the referred object.
-obislavu-