class HighLevelHeader : BasicHeader {
public HighLevelHeader() : base(0) {
protected override void UserProcessRoutine(BinaryReader br) {
protected BasicHeader(int id) {
protected virtual void UserProcessRoutine(BinaryReader br) { }
public static T FromStream<T>(Stream s) where T : BasicHeader {
ConstructorInfo ctor = typeof(T).GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
if ( ctor == null ) return default(T);
T header = (T) ctor.Invoke(null);
if ( header == null ) return default(T);
BinaryReader br = new BinaryReader(s);
header.g_id = br.ReadInt32();
header.UserProcessRoutine(br);
public static void Main() {
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
BasicHeader bh = BasicHeader.FromStream<BasicHeader>(ms);
HighLevelHeader hlh = BasicHeader.FromStream<HighLevelHeader>(ms);
Console.WriteLine(bh.Id);
Console.WriteLine(hlh.Id + "\t" + hlh.Age);