Action <AbstractBufferedWriter, ITypeBinarySerializerContext, object> NewComplexSaver(ITypeDescriptor descriptor) { var method = ILBuilder.Instance.NewMethod <Action <AbstractBufferedWriter, ITypeBinarySerializerContext, object> >(descriptor.Name + "ComplexSaver"); var il = method.Generator; descriptor.GenerateSave(il, ilgen => ilgen.Ldarg(0), ilgen => ilgen.Ldarg(1), ilgen => { ilgen.Ldarg(2); var type = descriptor.GetPreferredType(); if (type != typeof(object)) { ilgen.UnboxAny(type); } }, descriptor.GetPreferredType()); il.Ret(); return(method.Create()); }
Action <AbstractBufferedWriter, object> NewSimpleSaver(ITypeDescriptor descriptor) { if (descriptor.AnyOpNeedsCtx()) { return(null); } var method = ILBuilder.Instance.NewMethod <Action <AbstractBufferedWriter, object> >(descriptor.Name + "SimpleSaver"); var il = method.Generator; descriptor.GenerateSave(il, ilgen => ilgen.Ldarg(0), null, ilgen => { ilgen.Ldarg(1); var type = descriptor.GetPreferredType(); if (type != typeof(object)) { ilgen.UnboxAny(type); } }, descriptor.GetPreferredType()); il.Ret(); return(method.Create()); }
void InitFromItemDescriptor(ITypeDescriptor descriptor) { if (descriptor == _itemDescriptor && _name != null) { return; } _itemDescriptor = descriptor; if ((descriptor.Name?.Length ?? 0) == 0) { return; } _itemType = _itemDescriptor.GetPreferredType(); Sealed = _itemDescriptor.Sealed; Name = $"Nullable<{_itemDescriptor.Name}>"; }
public static void GenerateLoadEx(this ITypeDescriptor descriptor, IILGen ilGenerator, Action <IILGen> pushReader, Action <IILGen> pushCtx, Action <IILGen> pushDescriptor, Type asType, ITypeConvertorGenerator convertorGenerator) { if (descriptor.StoredInline) { if (descriptor.LoadNeedsHelpWithConversion && asType != typeof(object)) { var origType = descriptor.GetPreferredType(); descriptor.GenerateLoad(ilGenerator, pushReader, pushCtx, pushDescriptor, origType); if (origType != asType) { var conv = convertorGenerator.GenerateConversion(origType, asType); if (conv == null) { throw new BTDBException("Don't know how to convert " + descriptor.Name + " from " + origType.ToSimpleName() + " to " + asType.ToSimpleName()); } conv(ilGenerator); } } else { descriptor.GenerateLoad(ilGenerator, pushReader, pushCtx, pushDescriptor, asType); } } else { ilGenerator .Do(pushCtx) .Do(pushReader) .Callvirt(typeof(ITypeBinaryDeserializerContext).GetMethod(nameof(ITypeBinaryDeserializerContext.LoadObject)) !); if (asType != typeof(object)) { ilGenerator.Call(typeof(TypeDescriptorExtensions).GetMethod(nameof(IntelligentCast)) ! .MakeGenericMethod(asType)); } } }
public Type LoadAsType(ITypeDescriptor descriptor, Type targetType) { return(descriptor.GetPreferredType(targetType) ?? NameToType(descriptor.Name) ?? typeof(object)); }
public Type LoadAsType(ITypeDescriptor descriptor) { return(descriptor.GetPreferredType() ?? TypeNameMapper.ToType(descriptor.Name !) ?? typeof(object)); }