Consider introducing a dictionary of <RuntimeType, System.Type> with prepopulated value mappings. It will save you from the conditional logic scattered across three methods below.