private void LoadField <T>(ref T value, IImportProvider ip, string identifier, MetaField field, ImportAttribute attr) { var ifld = (ImportFieldAttribute)attr; Pointer <byte> ptr = ip.GetAddress(identifier); var options = ifld.FieldOptions; Pointer <byte> fieldAddr = field.GetValueAddress(ref value); object fieldValue; Global.Value.WriteDebug(Id, "Loading field {Id} with {Option}", field.Name, options); switch (options) { case ImportFieldOptions.CopyIn: fieldValue = CopyInField(ifld, field, ptr); break; case ImportFieldOptions.Proxy: fieldValue = ProxyLoadField(ifld, field, ptr); break; case ImportFieldOptions.Fast: FastLoadField(field, ptr, fieldAddr); return; default: throw new ArgumentOutOfRangeException(); } if (field.FieldType.IsAnyPointer) { ptr.WritePointer((Pointer <byte>)fieldValue); } else { ptr.WriteAny(field.FieldType.RuntimeType, fieldValue); } }