public override void Execute(IglTokenExecutionContext context) { var objType = context.TypeMap[ObjectType.Index]; var streamingContext = new StreamingContext(StreamingContextStates.Other); var info = new SerializationInfo(objType, new FormatterConverter()); foreach (var kv in Blob) { var nameInfo = kv.Key; var valueInfo = context.Storage[kv.Value]; info.AddValue(nameInfo, valueInfo); } var ctor = objType.GetBestConstructor(BindingFlags.Instance | BindingFlags.NonPublic, typeof(SerializationInfo), typeof(StreamingContext)); if (null == ctor) { throw new EntryPointNotFoundException(); } var rootObject = context.Storage[ObjectId]; ctor.Invoke(rootObject, new object[] { info, streamingContext }); if (rootObject is IDeserializationCallback callback) { callback.OnDeserialization(info); } }
public override void Execute(IglTokenExecutionContext context) { var src = Blob.Select(id => context.Storage[id]).ToArray(); var dst = context.Storage[ObjectId]; if (dst is Array arrayDest) { src.CopyTo(arrayDest, 0); } else { var destinationElementType = dst.GetType().GetElementTypeOfEnumerable(); var argType = typeof(IEnumerable <>).MakeGenericType(destinationElementType); var ctor = dst.GetType().GetBestConstructor(argType); if (ctor != null) { var tmpArray = Array.CreateInstance(destinationElementType, src.Length); src.CopyTo(tmpArray, 0); ctor.Invoke(dst, new object[] { tmpArray }); return; } if (dst is IList list) { foreach (var element in src) { list.Add(element); } } else { throw new InvalidOperationException(); } } }
public override void Execute(IglTokenExecutionContext context) { var instance = context.Storage[ObjectId]; if (instance == null) { return; } var value = context.Storage[ValueId]; var intanceType = instance.GetType(); var fi = intanceType.GetField(FieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); fi.SetValue(instance, value); }
public override void Execute(IglTokenExecutionContext context) { var type = context.TypeMap[TypeId]; if (ArrayDetails.Length == 0) { context.Storage[Index] = FormatterServices.GetUninitializedObject(type); } else if (ArrayDetails.Length > 1) { throw new NotSupportedException(); } else { context.Storage[Index] = Array.CreateInstance(type.GetElementType(), ArrayDetails[0].Item1); } }
public override void Execute(IglTokenExecutionContext context) { Blob.CopyTo((Array)context.Storage[ObjectId], 0); }
public override void Execute(IglTokenExecutionContext context) { context.Storage[Index] = Value; }
public override void Execute(IglTokenExecutionContext context) { context.TypeMap[Index] = Type.GetType(TypeName); }
public abstract void Execute(IglTokenExecutionContext context);