public void AbstractFamilyTreeWithTypes() { ConcreteOf2Abstracts ca = ConcreteOf2Abstracts.Create(1, 2, 3, 4, 5, 6); Abstract1 a1a = ca; Abstract2 a2a = ca; ConcreteOf2Abstracts cb = ca.With(abstract1Field1: 7, abstract2Field1: 8, concreteField1: 9); Assert.Equal(7, cb.Abstract1Field1); Assert.Equal(2, cb.Abstract1Field2); Assert.Equal(8, cb.Abstract2Field1); Assert.Equal(4, cb.Abstract2Field2); Assert.Equal(9, cb.ConcreteField1); Assert.Equal(6, cb.ConcreteField2); Abstract1 a1b = a1a.With(abstract1Field1: 7); Assert.Equal(7, a1b.Abstract1Field1); Assert.Equal(2, a1b.Abstract1Field2); Assert.Equal(3, ((ConcreteOf2Abstracts)a1b).Abstract2Field1); Assert.Equal(4, ((ConcreteOf2Abstracts)a1b).Abstract2Field2); Assert.Equal(5, ((ConcreteOf2Abstracts)a1b).ConcreteField1); Assert.Equal(6, ((ConcreteOf2Abstracts)a1b).ConcreteField2); Abstract2 a2b = a2a.With(abstract1Field1: 7, abstract2Field1: 8); Assert.Equal(7, a2b.Abstract1Field1); Assert.Equal(2, a2b.Abstract1Field2); Assert.Equal(8, a2b.Abstract2Field1); Assert.Equal(4, a2b.Abstract2Field2); Assert.Equal(5, ((ConcreteOf2Abstracts)a2b).ConcreteField1); Assert.Equal(6, ((ConcreteOf2Abstracts)a2b).ConcreteField2); }
public virtual ConcreteOf2Abstracts ToConcreteOf2Abstracts( ImmutableObjectGraph.Optional <System.Int32> abstract2Field1 = default(ImmutableObjectGraph.Optional <System.Int32>), ImmutableObjectGraph.Optional <System.Int32> abstract2Field2 = default(ImmutableObjectGraph.Optional <System.Int32>), ImmutableObjectGraph.Optional <System.Int32> concreteField1 = default(ImmutableObjectGraph.Optional <System.Int32>), ImmutableObjectGraph.Optional <System.Int32> concreteField2 = default(ImmutableObjectGraph.Optional <System.Int32>)) { ConcreteOf2Abstracts that = this as ConcreteOf2Abstracts; if (that != null && this.GetType().IsEquivalentTo(typeof(ConcreteOf2Abstracts))) { if ((!abstract2Field1.IsDefined || abstract2Field1.Value == that.Abstract2Field1) && (!abstract2Field2.IsDefined || abstract2Field2.Value == that.Abstract2Field2) && (!concreteField1.IsDefined || concreteField1.Value == that.ConcreteField1) && (!concreteField2.IsDefined || concreteField2.Value == that.ConcreteField2)) { return(that); } } return(ConcreteOf2Abstracts.CreateWithIdentity( abstract1Field1: Optional.For(this.Abstract1Field1), abstract1Field2: Optional.For(this.Abstract1Field2), identity: this.Identity, abstract2Field1: abstract2Field1, abstract2Field2: abstract2Field2, concreteField1: concreteField1, concreteField2: concreteField2)); }