public void Test() { var thingy = EmptyImplementations.GetEmptyImplementation <ITestInterface>(); thingy.Method1(); var resultA = thingy.MethodA(); var resultB = thingy.MethodB(); var resultC = thingy.MethodC(); var resultD = thingy.MethodD(); var resultE = thingy.MethodE(); var resultF = thingy.MethodF(); var resultG = thingy.MethodG(); var resultH = thingy.MethodH(); var resultI = thingy.MethodI(); var resultJ = thingy.MethodJ(); var resultK = thingy.MethodK(); var resultL = thingy.MethodL(); var resultM = thingy.MethodM(); var resultN = thingy.MethodN(); var resultO = thingy.MethodO(); var resultP = thingy.MethodP(); var resultQ = thingy.MethodQ(); var resultR = thingy.MethodR(); var resultS = thingy.MethodS(); Assert.AreEqual(default, resultA);
private object FromBytes(ref ByteReader reader, SerializerTypeDetails typeDetail, bool nullFlags, bool drainBytes) { if (!drainBytes && typeDetail == null) { throw new NotSupportedException("Cannot deserialize without type information"); } if (includePropertyTypes) { string typeName = reader.ReadString(false); var typeFromBytes = Discovery.GetTypeFromName(typeName); //overrides potentially boxed type with actual type if exists in assembly if (typeFromBytes != null) { var newTypeDetail = GetTypeInformation(typeFromBytes, this.indexSize, this.ignoreIndexAttribute); var typeDetailCheck = typeDetail.TypeDetail; if (typeDetailCheck.IsNullable) { typeDetailCheck = typeDetailCheck.InnerTypeDetails[0]; } var newTypeDetailCheck = newTypeDetail.TypeDetail; if (newTypeDetailCheck.Type != typeDetailCheck.Type && !newTypeDetailCheck.Interfaces.Contains(typeDetailCheck.Type) && !newTypeDetail.TypeDetail.BaseTypes.Contains(typeDetailCheck.Type)) { throw new NotSupportedException($"{newTypeDetail.Type.GetNiceName()} does not convert to {typeDetail.TypeDetail.Type.GetNiceName()}"); } typeDetail = newTypeDetail; } } else if (typeDetail.Type.IsInterface && !typeDetail.TypeDetail.IsIEnumerableGeneric) { var emptyImplementationType = EmptyImplementations.GetEmptyImplementationType(typeDetail.Type); typeDetail = GetTypeInformation(emptyImplementationType, this.indexSize, this.ignoreIndexAttribute); } if (typeDetail.TypeDetail.CoreType.HasValue) { return(FromBytesCoreType(ref reader, typeDetail.TypeDetail.CoreType.Value, nullFlags)); } if (typeDetail.TypeDetail.EnumUnderlyingType.HasValue) { var numValue = FromBytesCoreType(ref reader, typeDetail.TypeDetail.EnumUnderlyingType.Value, nullFlags); object value; if (!typeDetail.TypeDetail.IsNullable) { value = Enum.ToObject(typeDetail.Type, numValue); } else if (numValue != null) { value = Enum.ToObject(typeDetail.TypeDetail.InnerTypes[0], numValue); } else { value = null; } return(value); } if (typeDetail.TypeDetail.SpecialType.HasValue || typeDetail.TypeDetail.IsNullable && typeDetail.InnerTypeDetail.TypeDetail.SpecialType.HasValue) { return(FromBytesSpecialType(ref reader, typeDetail, nullFlags)); } if (typeDetail.TypeDetail.IsIEnumerableGeneric) { var enumerable = FromBytesEnumerable(ref reader, typeDetail.InnerTypeDetail, !typeDetail.TypeDetail.Type.IsArray && typeDetail.TypeDetail.IsIList); return(enumerable); } if (nullFlags) { var hasObject = reader.ReadBoolean(); if (!hasObject) { return(null); } } object obj = typeDetail.TypeDetail.Creator(); for (; ;) { SerializerMemberDetails indexProperty = null; if (usePropertyNames) { string name = reader.ReadString(false); if (name == String.Empty) { return(obj); } indexProperty = typeDetail.IndexedProperties.Values.FirstOrDefault(x => x.Name == name); if (indexProperty == null) { if (!usePropertyNames && !includePropertyTypes) { throw new Exception($"Cannot deserialize with property {name} undefined and no types."); } //consume bytes but object does not have property object value = FromBytes(ref reader, null, false, true); indexProperty.Setter(obj, value); } else { object value = FromBytes(ref reader, indexProperty.SerailzierTypeDetails, false, false); indexProperty.Setter(obj, value); } } else { var propertyIndex = this.indexSize switch { ByteSerializerIndexSize.Byte => (ushort)reader.ReadByte(), ByteSerializerIndexSize.UInt16 => reader.ReadUInt16(), _ => throw new NotImplementedException(), }; if (propertyIndex == endObjectFlagUShort) { return(obj); } if (typeDetail.IndexedProperties.Keys.Contains(propertyIndex)) { indexProperty = typeDetail.IndexedProperties[propertyIndex]; } if (indexProperty == null) { if (!usePropertyNames && !includePropertyTypes) { throw new Exception($"Cannot deserialize with property {propertyIndex} undefined and no types."); } //consume bytes but object does not have property object value = FromBytes(ref reader, null, false, true); indexProperty.Setter(obj, value); } else { object value = FromBytes(ref reader, indexProperty.SerailzierTypeDetails, false, false); indexProperty.Setter(obj, value); } } } throw new Exception("Expected end of object marker"); }