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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
 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));
Exemple #9
0
 public PropertyToProcess(ObjectMemberSharedInfo info, PropertyInfo property, Converter parent) =>
 (Info, Parent, Property) = (info, parent, property);