Example #1
0
        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);
            }
        }