LocalBuilder DeclareLocalVariable(Type type, bool isReturnValue = false) { if (type.IsByRef && isReturnValue == false) { type = type.GetElementType(); } if (type.IsEnum) { type = Enum.GetUnderlyingType(type); } if (AccessTools.IsClass(type)) { var v = il.DeclareLocal(type); emitter.Emit(OpCodes.Ldnull); emitter.Emit(OpCodes.Stloc, v); return(v); } if (AccessTools.IsStruct(type)) { var v = il.DeclareLocal(type); emitter.Emit(OpCodes.Ldloca, v); emitter.Emit(OpCodes.Initobj, type); return(v); } if (AccessTools.IsValue(type)) { var v = il.DeclareLocal(type); if (type == typeof(float)) { emitter.Emit(OpCodes.Ldc_R4, (float)0); } else if (type == typeof(double)) { emitter.Emit(OpCodes.Ldc_R8, (double)0); } else if (type == typeof(long) || type == typeof(ulong)) { emitter.Emit(OpCodes.Ldc_I8, (long)0); } else { emitter.Emit(OpCodes.Ldc_I4, 0); } emitter.Emit(OpCodes.Stloc, v); return(v); } return(null); }
internal static LocalBuilder DeclareLocalVariable(ILGenerator generator, Type type) { if (type.IsByRef) { type = type.GetElementType(); } if (type.IsEnum) { type = Enum.GetUnderlyingType(type); } if (AccessTools.IsClass(type)) { var v = generator.DeclareLocal(type); Emitter.Emit(generator, OpCodes.Ldnull); Emitter.Emit(generator, OpCodes.Stloc, v); return(v); } if (AccessTools.IsStruct(type)) { var v = generator.DeclareLocal(type); Emitter.Emit(generator, OpCodes.Ldloca, v); Emitter.Emit(generator, OpCodes.Initobj, type); return(v); } if (AccessTools.IsValue(type)) { var v = generator.DeclareLocal(type); if (type == typeof(float)) { Emitter.Emit(generator, OpCodes.Ldc_R4, (float)0); } else if (type == typeof(double)) { Emitter.Emit(generator, OpCodes.Ldc_R8, (double)0); } else if (type == typeof(long) || type == typeof(ulong)) { Emitter.Emit(generator, OpCodes.Ldc_I8, (long)0); } else { Emitter.Emit(generator, OpCodes.Ldc_I4, 0); } Emitter.Emit(generator, OpCodes.Stloc, v); return(v); } return(null); }