private XDRPCArrayArgumentInfo <T> .ArrayElementData GenerateArrayBufferData( XDRPCArgumentInfo info, ref int referenceOffset) { XDRPCArrayArgumentInfo <T> .ArrayElementData arrayElementData = new XDRPCArrayArgumentInfo <T> .ArrayElementData(); arrayElementData.Info = info; arrayElementData.ReferenceOffset = referenceOffset; arrayElementData.ReferenceSize = info.GetRequiredReferenceSize(); referenceOffset += arrayElementData.ReferenceSize; XDRPCExecutionState.AlignBufferOffset(ref referenceOffset); return(arrayElementData); }
private object UnpackValuesRecursive( Type structType, object structToMarshal, ref List <XDRPCStructArgumentInfo <T> .StructBufferData> .Enumerator bufferEnum) { foreach (FieldInfo field in structType.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) { Type fieldType = field.FieldType; XDRPCStructArgumentInfo <T> .StructBufferData structBufferData = bufferEnum.Current; if (fieldType == typeof(string) || fieldType.IsArray || fieldType.IsPrimitive) { if (structBufferData.ReferenceIndex != -1) { if (structBufferData.Info.GetRequiredReferenceSize() == 0) { structBufferData = this._referenceBufferDataList[structBufferData.ReferenceIndex]; } if (structBufferData.Info.GetRequiredReferenceSize() > 0) { XDRPCArrayArgumentInfo <byte[]> info = (XDRPCArrayArgumentInfo <byte[]>) this._referenceBufferDataList[structBufferData.ReferenceIndex].Info; structBufferData.Info.UnpackReferenceData(info.Value); } } object obj = this.ValidateArgInfoNullValue(fieldType, structBufferData.Info); field.SetValue(structToMarshal, obj); bufferEnum.MoveNext(); } else if (fieldType.IsValueType) { object obj; if (structBufferData.ReferenceIndex != -1) { List <XDRPCStructArgumentInfo <T> .StructBufferData> .Enumerator enumerator = this._referenceBufferDataList.GetEnumerator(); do { enumerator.MoveNext(); }while (enumerator.Current.Info != this._referenceBufferDataList[structBufferData.ReferenceIndex].Info); obj = this.UnpackValuesRecursive(fieldType, field.GetValue(structToMarshal), ref enumerator); bufferEnum.MoveNext(); } else { obj = this.UnpackValuesRecursive(fieldType, field.GetValue(structToMarshal), ref bufferEnum); } field.SetValue(structToMarshal, obj); } } return(structToMarshal); }