private static void GenerateNativeEnumerable(MethodDefinition method, TypeReference TTo, ModuleDefinition systemModule) { var create = method.ReturnType.FindMethod("Create", 2); var invalidCastException = method.Module.ImportReference(systemModule.GetType("System", nameof(InvalidCastException))); var success = Instruction.Create(OpCodes.Sizeof, TTo); var enumerable = new GenericInstanceType(method.DeclaringType) { GenericArguments = { method.DeclaringType.GenericParameters[0] } }; method.Body.GetILProcessor() .LdArg(0) .LdFld(enumerable.FindField("Ptr")) .LdArg(0) .LdFld(enumerable.FindField("Length")) .SizeOf(enumerable.GenericArguments[0]) .ConvI8() .Mul() // byte長さ .Dup() // 比較用ベース .Dup() // 比較用計算後 .SizeOf(TTo) .Div() .SizeOf(TTo) .Add(Instruction.Create(OpCodes.Mul)) .BeqS(success) .Pop() .Pop() .NewObj(invalidCastException.FindMethod(".ctor", 0)) .Throw() .Add(success) .Div() .Call(create) .Ret(); }