public override void Open() { var item = Owner._evalStack.Peek(); StackAssert.AreEqual(item, new StackItem(item.Type, LoadOptions.Default)); _targetDisposeMethod = UsingTarget.Type.GetBestCallableOverride(_disposeMethod); UsingTarget = Owner.Declare(item.Type); Owner.Store(UsingTarget); base.Open(); Owner._writer.BeginTry(); }
/// <summary> /// <para>开始创建新的数组</para> /// <para>请在此方法时候,调用加载数组长度的方法,例如:</para> /// <code> /// g.BeginNewArray(_elementType); /// { /// g.Load(count); /// } /// g.EndNewArray(); /// </code> /// </summary> /// <param name="elementType">数组的成员类型</param> /// <param name="rank">维数</param> private void BeginNewArray(Type elementType, int rank) { if (elementType == null) { throw new ArgumentNullException("elementType"); } if (rank < 1) { throw new ArgumentOutOfRangeException("rank", "数组维度不能小于1"); } var arrayType = rank == 1 ? elementType.MakeArrayType() : elementType.MakeArrayType(rank); _delayedInstructions.Push(() => { for (int i = 0; i < rank; ++i) { StackAssert.AreEqual(_evalStack.Pop(), typeof(int)); } if (rank == 1) { //创建一维数组 //将对新的从零开始的一维数组(其元素属于特定类型)的对象引用推送到计算堆栈上 _writer.Emit(OpCodes.Newarr, elementType); } else { var paramTypes = new Type[rank]; for (int i = 0; i < paramTypes.Length; ++i) { paramTypes[i] = typeof(int); } //创建多维数组 //利用多维数组的构造函数,创建多维数组对象 _writer.Emit(OpCodes.Newobj, arrayType.GetConstructor(paramTypes)); } _evalStack.Push(arrayType); }); }