Every object in the CLR begins with a fixed-size object header. The Object header has two fields. The first field of the object header is the sync block index. The second field of the object header is a handler to an opaque data structure that represents the object’s type. Every instance of a given type will have the same type handle value in its object header. To support down-casts and side-casts, CIL defines two opcodes: isinst and castclass. Both opcodes generate code that examines the object’s type handle to determine whether or not the object’s type is compatible with the request type.
Both isinst and castclass take advantage of the data structure referenced by RuntimeTypeHandle. The data structure (CORINFO_CLASS_STRUCT) contains several critical pieces of information. Each type has an interface table. This table contains one entry for each interface that the type is compatible with. The data structure also contains a pointer to the in-memory representation of the type’s base type.