public void Load(IILGen ilGenerator, Action<IILGen> pushReaderOrCtx)
{
var localCount = ilGenerator.DeclareLocal(typeof(uint));
var localResultOfObject = ilGenerator.DeclareLocal(typeof(object));
var localResult = ilGenerator.DeclareLocal(HandledType());
var loadSkipped = ilGenerator.DefineLabel();
var finish = ilGenerator.DefineLabel();
var readfinish = ilGenerator.DefineLabel();
var next = ilGenerator.DefineLabel();
var genericArguments = _type.GetGenericArguments();
object fake;
ilGenerator
.Do(pushReaderOrCtx)
.Ldloca(localResultOfObject)
.Callvirt(() => default(IReaderCtx).ReadObject(out fake))
.Brfalse(loadSkipped)
.Do(Extensions.PushReaderFromCtx(pushReaderOrCtx))
.Callvirt(() => default(AbstractBufferedReader).ReadVUInt32())
.Stloc(localCount)
.Ldloc(localCount)
.Newobj(typeof(Dictionary<,>).MakeGenericType(genericArguments).GetConstructor(new[] { typeof(int) }))
.Stloc(localResult)
.Do(pushReaderOrCtx)
.Ldloc(localResult)
.Castclass(typeof(object))
.Callvirt(() => default(IReaderCtx).RegisterObject(null))
.Mark(next)
.Ldloc(localCount)
.Brfalse(readfinish)
.Ldloc(localCount)
.LdcI4(1)
.Sub()
.ConvU4()
.Stloc(localCount)
.Ldloc(localResult)
.GenerateLoad(_keysHandler, genericArguments[0], pushReaderOrCtx, _typeConvertorGenerator)
.GenerateLoad(_valuesHandler, genericArguments[1], pushReaderOrCtx, _typeConvertorGenerator)
.Callvirt(_type.GetMethod("Add"))
.Br(next)
.Mark(readfinish)
.Do(pushReaderOrCtx)
.Callvirt(() => default(IReaderCtx).ReadObjectDone())
.Br(finish)
.Mark(loadSkipped)
.Ldloc(localResultOfObject)
.Isinst(_type)
.Stloc(localResult)
.Mark(finish)
.Ldloc(localResult);
}