Yes, that's what I meant by type information. There's no good solution , the GC approach is probably closest if you know what you're doing. Serialisation can work to give an approximate size.
Theoretically you can iterate through the class members and recursively dip into reference types then add up everything, but this is fraught with difficultly. If you want to know more, take a look at Advanced .net debugging which is old but goes into a lot of the internals and describes ways of inspecting and dumping .net objects. This is the updated version that I don't have and may no longer exist (edit: or it isn't published yet). And This is a pluralsight course on the same.
Possible some context of what OP intends to do with the object sizes would help.
Another option I just thought of is to use DotMemory with the DotMemory unit test extensions. This gives you the ability to build a unit test that measures memory usage, allocations, basically everything that DotMemory can show you in its profiler, but in a unit test. It's pretty simple to use (Was pretty simple to use, I haven't used it in 18 months). I don't remember if you need to own DotMemory to use it, it's a nuget package, so give it a go.
Hewardt also made the Advanced .NET Debugging book which is pretty great for that type of debugging.
https://www.amazon.com/Advanced-NET-Debugging-Mario-Hewardt/dp/0321578899