public void CanSetAllPropertyTypes()
        {
            var item = new ClassContainingAllBasicPropertyTypes();

            var guid = Guid.NewGuid();
            var details = item.GetTypeDetails();

            details.PropertyWriters.First(p => p.Name.Equals("Byte")).Write(item, (byte) 5);
            details.PropertyWriters.First(p => p.Name.Equals("Short")).Write(item, (short)55);
            details.PropertyWriters.First(p => p.Name.Equals("Int")).Write(item, 5433);
            details.PropertyWriters.First(p => p.Name.Equals("Long")).Write(item, (long)52334343);
            details.PropertyWriters.First(p => p.Name.Equals("Float")).Write(item, (float)643.44);
            details.PropertyWriters.First(p => p.Name.Equals("Double")).Write(item, 35.323);
            details.PropertyWriters.First(p => p.Name.Equals("Decimal")).Write(item, (decimal)234.2343);
            details.PropertyWriters.First(p => p.Name.Equals("Guid")).Write(item, guid);

            details.PropertyWriters.First(p => p.Name.Equals("NullableByte")).Write(item, (byte)5);
            details.PropertyWriters.First(p => p.Name.Equals("NullableShort")).Write(item, (short)55);
            details.PropertyWriters.First(p => p.Name.Equals("NullableInt")).Write(item, 5433);
            details.PropertyWriters.First(p => p.Name.Equals("NullableLong")).Write(item, (long)52334343);
            details.PropertyWriters.First(p => p.Name.Equals("NullableFloat")).Write(item, (float)643.44);
            details.PropertyWriters.First(p => p.Name.Equals("NullableDouble")).Write(item, (double)35.323);
            details.PropertyWriters.First(p => p.Name.Equals("NullableDecimal")).Write(item, (decimal)234.2343);
            details.PropertyWriters.First(p => p.Name.Equals("NullableGuid")).Write(item, guid);

            details.PropertyWriters.First(p => p.Name.Equals("Char")).Write(item, 'r');
            details.PropertyWriters.First(p => p.Name.Equals("String")).Write(item, "my string");
            details.PropertyWriters.First(p => p.Name.Equals("Object")).Write(item, new ClassContainingAllBasicPropertyTypes() { String = "My Written Object" });            

            Assert.NotNull(item);
            Assert.Equal((byte)5, item.Byte);
            Assert.Equal((short)55, item.Short);
            Assert.Equal(5433, item.Int);
            Assert.Equal((long)52334343, item.Long);
            Assert.Equal((float)643.44, item.Float);
            Assert.Equal(35.323, item.Double);
            Assert.Equal((decimal)234.2343, item.Decimal);
            Assert.Equal(guid, item.Guid);

            Assert.Equal((byte)5, item.NullableByte);
            Assert.Equal((short)55, item.NullableShort);
            Assert.Equal(5433, item.NullableInt);
            Assert.Equal((long)52334343, item.NullableLong);
            Assert.Equal((float)643.44, item.NullableFloat);
            Assert.Equal(35.323, item.NullableDouble);
            Assert.Equal((decimal)234.2343, item.NullableDecimal);
            Assert.Equal(guid, item.NullableGuid);

            Assert.Equal('r', item.Char);
            Assert.Equal("my string", item.String);
            Assert.NotNull(item.Object);
            Assert.Equal("My Written Object", item.Object.String);
            Assert.Null(item.Object.Object);
        }
        public void CanReadAllPropertyTypes()
        {
            var item = new ClassContainingAllBasicPropertyTypes()
            {
                Byte = 4,
                Short = 42,
                Int = 11,
                Long = 11101101011011011,
                Float = (float) 0.23,
                Double = 0.444,
                Decimal = (decimal) 1.22,
                Guid = Guid.NewGuid(),
                NullableByte = null,
                NullableShort = 42,
                NullableInt = 11,
                NullableLong = 11101101011011011,
                NullableFloat = (float) 0.23,
                NullableDouble = 0.444,
                NullableDecimal = (decimal) 1.22,
                NullableGuid = Guid.NewGuid()
            };

            item.Object = item;
            var details = item.GetTypeDetails();

            Assert.Equal(item.Byte, details.PropertyReaders.First(r => r.Name.Equals("Byte")).Read(item));
            Assert.Equal(item.Short, details.PropertyReaders.First(r => r.Name.Equals("Short")).Read(item));
            Assert.Equal(item.Int, details.PropertyReaders.First(r => r.Name.Equals("Int")).Read(item));
            Assert.Equal(item.Long, details.PropertyReaders.First(r => r.Name.Equals("Long")).Read(item));
            Assert.Equal(item.Float, details.PropertyReaders.First(r => r.Name.Equals("Float")).Read(item));
            Assert.Equal(item.Double, details.PropertyReaders.First(r => r.Name.Equals("Double")).Read(item));
            Assert.Equal(item.Decimal, details.PropertyReaders.First(r => r.Name.Equals("Decimal")).Read(item));
            Assert.Equal(item.Guid, details.PropertyReaders.First(r => r.Name.Equals("Guid")).Read(item));

            Assert.Equal(item.NullableByte, details.PropertyReaders.First(r => r.Name.Equals("NullableByte")).Read(item));
            Assert.Equal(item.NullableShort, details.PropertyReaders.First(r => r.Name.Equals("NullableShort")).Read(item));
            Assert.Equal(item.NullableInt, details.PropertyReaders.First(r => r.Name.Equals("NullableInt")).Read(item));
            Assert.Equal(item.NullableLong, details.PropertyReaders.First(r => r.Name.Equals("NullableLong")).Read(item));
            Assert.Equal(item.NullableFloat, details.PropertyReaders.First(r => r.Name.Equals("NullableFloat")).Read(item));
            Assert.Equal(item.NullableDouble, details.PropertyReaders.First(r => r.Name.Equals("NullableDouble")).Read(item));
            Assert.Equal(item.NullableDecimal, details.PropertyReaders.First(r => r.Name.Equals("NullableDecimal")).Read(item));
            Assert.Equal(item.NullableGuid, details.PropertyReaders.First(r => r.Name.Equals("NullableGuid")).Read(item));

            Assert.Equal(item.Object, details.PropertyReaders.First(r => r.Name.Equals("Object")).Read(item));
        }