A base class reference is: from your example an A which
actually contains a

C or B.

Honestly I haven't tried this I would have assumed that D
still gives you

the real type when using reflection but have you tried it?

Unfortunately the only why to get a value of field by
reflection requires the static type to be known. When
serializing through a base class reference the static type is
lost. Therefore it's required to register the subclass, one way
or another.