static ObjectMemberSharedInfo CreateItem(ObjectConverter item, IntermediateItem intermediate, MapGenerator gen) { var dest = new ObjectMemberSharedInfo(); MemberInfo?memberInfo = intermediate.Details.Unprocessed; Type itemType; if (memberInfo is FieldInfo field) { itemType = field.FieldType; MemberAccessorGenerator.GenerateFieldAccessor(ref dest.Accessor, memberInfo); } else if (memberInfo is PropertyInfo property) { itemType = property.PropertyType; MemberAccessorGenerator.GeneratePropertyAccessor(gen, dest, property, item); } else { throw new Exception("Unrecognized member info in shared info"); } dest.Map = gen.GetMap(itemType); return(dest); }
public static ObjectMemberSharedInfo[] GenerateForOneVersion(ObjectConverter item, MapGenerator gen) { IntermediateItem[] rawMembers = item._intermediateInfo.Members !; // No need to do any checks at all - just copy the items right across! var outputArr = new ObjectMemberSharedInfo[rawMembers.Length]; for (int i = 0; i < outputArr.Length; i++) { outputArr[i] = CreateItem(item, rawMembers[i], gen); } return(outputArr); }
public void GetFieldAccessor() { Setup(); var memberInfo = typeof(FieldClass).GetField(nameof(FieldClass.A)); var item = new ObjectMemberSharedInfo(); MemberAccessorGenerator.GenerateFieldAccessor(ref item.Accessor, memberInfo); Assert.IsInstanceOfType(item.Accessor.Object1, typeof(FieldInfo)); Assert.AreEqual(MemberAccessorType.Field, item.Accessor.Type); VerifyRuns <FieldClass, string>(ref item.Accessor); }
public void GetPropertyAccessor_ValueTypeParent() { Setup(); // Primitive var memberInfo = typeof(AllPrimitiveStruct).GetProperty(nameof(AllPrimitiveStruct.C)) !; var item = new ObjectMemberSharedInfo(); RunGenerateAccessor(ref item.Accessor, typeof(string), typeof(AllPrimitiveStruct), memberInfo); Assert.IsInstanceOfType(item.Accessor.Object1, typeof(PropertyInfo)); Assert.AreEqual(MemberAccessorType.SlowProperty, item.Accessor.Type); VerifyRuns <AllPrimitiveStruct, string>(ref item.Accessor); }
public void GetPropertyAccessor_ValueType_Unsupported() { Setup(); // Primitive var memberInfo = typeof(ClassWithUnspportedForFastAccessorValueType).GetProperty(nameof(ClassWithUnspportedForFastAccessorValueType.S)) !; var item = new ObjectMemberSharedInfo(); RunGenerateAccessor(ref item.Accessor, typeof(AllPrimitiveStruct), typeof(ClassWithUnspportedForFastAccessorValueType), memberInfo); Assert.IsInstanceOfType(item.Accessor.Object1, typeof(PropertyInfo)); Assert.AreEqual(MemberAccessorType.SlowProperty, item.Accessor.Type); VerifyRuns <ClassWithUnspportedForFastAccessorValueType, AllPrimitiveStruct>(ref item.Accessor); }
public void GetPropertyAccessor_AllRefTypes() { Setup(); // Primitive var memberInfo = typeof(NestedClass).GetProperty(nameof(NestedClass.B)) !; var item = new ObjectMemberSharedInfo(); RunGenerateAccessor(ref item.Accessor, typeof(SubWithHeader), typeof(NestedClass), memberInfo); Assert.IsInstanceOfType(item.Accessor.Object1, typeof(MemberAccessorGenerator.ReferenceGetterDelegate <NestedClass>)); Assert.IsInstanceOfType(item.Accessor.Object2, typeof(Action <NestedClass, SubWithHeader>)); Assert.AreEqual(MemberAccessorType.AllRefProperty, item.Accessor.Type); VerifyRuns <NestedClass, SubWithHeader>(ref item.Accessor); }
public void GetPropertyAccessor_ValueType_Supported() { Setup(); // Primitive var memberInfo = typeof(NestedClass).GetProperty(nameof(NestedClass.A)) !; var item = new ObjectMemberSharedInfo(); RunGenerateAccessor(ref item.Accessor, typeof(byte), typeof(NestedClass), memberInfo); Assert.IsInstanceOfType(item.Accessor.Object1, typeof(Func <NestedClass, byte>)); Assert.IsInstanceOfType(item.Accessor.Object2, typeof(Action <NestedClass, byte>)); Assert.AreEqual(MemberAccessorType.PrimitiveProperty, item.Accessor.Type); Assert.AreEqual(TypeCode.Byte, item.Accessor.PrimitiveTypeCode); VerifyRuns <NestedClass, byte>(ref item.Accessor); }
internal static void GeneratePropertyAccessor(MapGenerator gen, ObjectMemberSharedInfo info, PropertyInfo property, Converter parent) => // Queue it up to be processed later, where "DoGeneratePropertyAccessor" will be running parallel. gen.QueuePropertyForProcessing(new PropertyToProcess(info, property, parent));
public PropertyToProcess(ObjectMemberSharedInfo info, PropertyInfo property, Converter parent) => (Info, Parent, Property) = (info, parent, property);