예제 #1
0
        public void TestDictionaryConversion()
        {
            var x = new { Text = "Behold, an anonymous object", Number = 42 };
            var y = new { Text = "Another anonymous object", Number = 69 };
            var z = new TestClass0();
            var w = new TestClass1(42);
            var v = ReflectionUtilities.CreateEmpty <TestClass0>();

            var dx = x.ToDictionary();
            var dy = y.ToDictionary();
            var dz = z.ToDictionary();
            var dw = w.ToDictionary();
            var dv = v.ToDictionary();

            Assert.AreEqual(x.Text, dx["Text"]);
            Assert.AreEqual(y.Text, dy["Text"]);
            Assert.AreNotEqual(x.Text, dy["Text"]);
            Assert.AreEqual(x.Number, dx["Number"]);
            Assert.AreEqual(y.Number, dy["Number"]);
            Assert.AreNotEqual(x.Number, dy["Number"]);
            Assert.AreNotEqual(dx["Text"], dx["Number"]);
            Assert.AreEqual(true, dz["IsInitialized"]);
            Assert.AreEqual(43, dw["Value"]);
            Assert.AreEqual(false, dv["IsInitialized"]);
        }
예제 #2
0
        public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType == JsonTokenType.Null)
            {
                return(null);
            }

            if (reader.TokenType != JsonTokenType.StartObject)
            {
                throw new JsonException($"Expected object start, got '{reader.TokenType}' instead.");
            }

            var obj   = ReflectionUtilities.CreateEmpty <T>();
            var model = this.Model;

            while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
            {
                if (reader.TokenType != JsonTokenType.PropertyName)
                {
                    throw new JsonException($"Expected property name, got '{reader.TokenType}' instead.");
                }

                var name = reader.GetString();
                if (!reader.Read())
                {
                    throw new EndOfStreamException("Reached end of JSON stream.");
                }

                var prop = model.GetJsonProperty(name);
                if (prop == null)
                {
                    throw new JsonException($"Property '{name}' is not present on object of type '{typeToConvert}'.");
                }

                var val = JsonSerializer.Deserialize(ref reader, prop.Property.PropertyType, options);
                prop.Property.SetValue(obj, val);
            }

            return(obj);
        }
예제 #3
0
        public void TestEmptyObjects()
        {
            // Create empty objects
            var o0 = ReflectionUtilities.CreateEmpty <TestClass0>();
            var o1 = ReflectionUtilities.CreateEmpty <TestClass1>();

            var p0 = typeof(TestClass0).CreateEmpty() as TestClass0;
            var p1 = typeof(TestClass1).CreateEmpty() as TestClass1;

            // Test that they are empty
            Assert.IsFalse(o0.IsInitialized);
            Assert.AreEqual(0, o1.Value);

            // Test that nongeneric variants created appropriate types
            Assert.IsNotNull(p0);
            Assert.IsInstanceOfType(p0, typeof(TestClass0));

            Assert.IsNotNull(p1);
            Assert.IsInstanceOfType(p1, typeof(TestClass1));

            // Test that the objects are empty
            Assert.IsFalse(p0.IsInitialized);
            Assert.AreEqual(0, p1.Value);
        }