/// <summary> /// Adds a known sub-type to the inheritance model /// </summary> public MetaType AddSubType(int fieldNumber, Type derivedType) { if (!(type.IsClass || type.IsInterface) || type.IsSealed) { throw new InvalidOperationException("Sub-types can only be added to non-sealed classes"); } if (typeof(IEnumerable).IsAssignableFrom(type)) { throw new ArgumentException("Repeated data (a list, collection, etc) has inbuilt behaviour and cannot be subclassed"); } ThrowIfFrozen(); MetaType derivedMeta = model[derivedType]; derivedMeta.ThrowIfFrozen(); SubType subType = new SubType(fieldNumber, derivedMeta); ThrowIfFrozen(); derivedMeta.SetBaseType(this); // includes ThrowIfFrozen if (subTypes == null) { subTypes = new BasicList(); } subTypes.Add(subType); return(this); }
/// <summary> /// Adds a known sub-type to the inheritance model /// </summary> public MetaType AddSubType(int fieldNumber, Type derivedType) { if (!type.IsClass || type.IsSealed) { throw new InvalidOperationException("Sub-types can only be adedd to non-sealed classes"); } MetaType derivedMeta = model[derivedType]; SubType subType = new SubType(fieldNumber, derivedMeta); ThrowIfFrozen(); derivedMeta.SetBaseType(this); // includes ThrowIfFrozen if (subTypes == null) { subTypes = new BasicList(); } subTypes.Add(subType); return(this); }