public void GenerateTypeIterator(IILGen ilGenerator, Action <IILGen> pushObj, Action <IILGen> pushCtx, Type type)
{
var finish = ilGenerator.DefineLabel();
var next = ilGenerator.DefineLabel();
if (type == typeof(object))
{
type = _listTypeDescriptor.GetPreferedType();
}
var targetIList = type.GetInterface("IList`1") ?? type;
var targetTypeArguments = targetIList.GetGenericArguments();
var itemType = _listTypeDescriptor._typeSerializers.LoadAsType(_listTypeDescriptor._itemDescriptor, targetTypeArguments[0]);
var localList = ilGenerator.DeclareLocal(typeof(IList <>).MakeGenericType(itemType));
var localIndex = ilGenerator.DeclareLocal(typeof(int));
var localCount = ilGenerator.DeclareLocal(typeof(int));
ilGenerator
.Do(pushObj)
.Castclass(localList.LocalType)
.Stloc(localList)
.Ldloc(localList)
.Callvirt(localList.LocalType.GetInterface("ICollection`1").GetProperty("Count").GetGetMethod())
.Stloc(localCount)
.LdcI4(0)
.Stloc(localIndex)
.Mark(next)
.Ldloc(localIndex)
.Ldloc(localCount)
.BgeUn(finish)
.Do(pushCtx)
.Ldloc(localList)
.Ldloc(localIndex)
.Callvirt(localList.LocalType.GetMethod("get_Item"))
.Callvirt(() => default(IDescriptorSerializerLiteContext).StoreNewDescriptors(null))
.Ldloc(localIndex)
.LdcI4(1)
.Add()
.Stloc(localIndex)
.Br(next)
.Mark(finish);
}