It kind of depends what the solid looks like, but here are some ideas.
For a solid that is built correctly, all of the surface normal vectors should point outwards, like this:
Assuming the solid is made up of planar surfaces, you could get the normal vectors for each surface using Surface.NormalAtParameter (the image shows the result with 0.5 for U and V, which would be in the middle). Then you could check the Z component of those vectors. The vector with a positive Z component would be the top, and then you could filter the original list of surfaces with List.FilterByBoolMask. However, this won’t work very well if the surfaces for the sides are slanted, or not parallel with the world Z axis. In that case, one of those side vectors would also have a positive Z component and you couldn’t distinguish from the top surface.
Something else you could try would be to get points at the center of each surface using Surface.PointAtParameter with U and V equal to 0.5. Then get the elevations of each point, and the highest value would be the top surface. Again, this would not always be true if the surfaces are slanted (e.g. cross slope). Then the point on the “uphill” side might actually be higher than the true top surface, like this: