diff --git a/.gitignore b/.gitignore index 646c93b1..2fcb12de 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ [Bb]in/ [Oo]bj/ [Ww]orking/ +Build/runbuild.txt +Doc/doc.shfbproj_* TestResults/ AppPackages/ *.suo diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index e224a18d..1e18fd9b 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -90,39 +90,73 @@ namespace Newtonsoft.Json.Tests.Serialization [TestFixture] public class JsonSerializerTest : TestFixtureBase { - //[DataContract] - //public class BaseDataContract1 - //{ - // [DataMember(Name = "virtualMember")] - // public virtual string VirtualMember { get; set; } + public class GenericItem + { + public T Value { get; set; } + } - // [DataMember(Name = "nonVirtualMember")] - // public string NonVirtualMember { get; set; } + public class NonGenericItem : GenericItem + { - // public virtual object NewMember { get; set; } - //} + } - //public class ChildDataContract1 : BaseDataContract1 - //{ - // [DataMember(Name = "NewMember")] - // public virtual new string NewMember { get; set; } - // public override string VirtualMember { get; set; } - // public string AddedMember { get; set; } - //} + public class GenericClass : IEnumerable + where T : GenericItem, new() + { + public IList Items { get; set; } - //[Test] - //public void ChildDataContractTest1() - //{ - // var cc = new ChildDataContract1 - // { - // VirtualMember = "VirtualMember!", - // NonVirtualMember = "NonVirtualMember!", - // NewMember = "NewMember!" - // }; + public GenericClass() + { + Items = new List(); + } - // string result = JsonConvert.SerializeObject(cc); - // Assert.AreEqual(@"{""NewMember"":""NewMember!"",""virtualMember"":""VirtualMember!"",""nonVirtualMember"":""NonVirtualMember!""}", result); - //} + public IEnumerator GetEnumerator() + { + if (Items != null) + { + foreach (T item in Items) + { + yield return item; + } + } + else + yield break; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + public class NonGenericClass : GenericClass, string> + { + + } + + [Test] + public void GenericCollectionInheritance() + { + string json; + + GenericClass, string> foo1 = new GenericClass, string>(); + foo1.Items.Add(new GenericItem {Value = "Hello"}); + + json = JsonConvert.SerializeObject(new {selectList = foo1}); + Assert.AreEqual(@"{""selectList"":[{""Value"":""Hello""}]}", json); + + GenericClass foo2 = new GenericClass(); + foo2.Items.Add(new NonGenericItem {Value = "Hello"}); + + json = JsonConvert.SerializeObject(new { selectList = foo2 }); + Assert.AreEqual(@"{""selectList"":[{""Value"":""Hello""}]}", json); + + NonGenericClass foo3 = new NonGenericClass(); + foo3.Items.Add(new NonGenericItem {Value = "Hello"}); + + json = JsonConvert.SerializeObject(new { selectList = foo3 }); + Assert.AreEqual(@"{""selectList"":[{""Value"":""Hello""}]}", json); + } [Test] public void PersonTypedObjectDeserialization() diff --git a/Src/Newtonsoft.Json/Serialization/JsonArrayContract.cs b/Src/Newtonsoft.Json/Serialization/JsonArrayContract.cs index ed948493..6b1861a9 100644 --- a/Src/Newtonsoft.Json/Serialization/JsonArrayContract.cs +++ b/Src/Newtonsoft.Json/Serialization/JsonArrayContract.cs @@ -143,7 +143,7 @@ namespace Newtonsoft.Json.Serialization ParametrizedConstructor = CollectionUtils.ResolveEnumableCollectionConstructor(underlyingType, CollectionItemType); - if (underlyingType.GetGenericTypeDefinition() == typeof (IEnumerable<>)) + if (underlyingType.IsGenericType() && underlyingType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) { _genericCollectionDefinitionType = tempCollectionType;