Exemplo n.º 1
0
        public void Array_CanCast_ClassArray_TAnotherClassArray()
        {
            // It does not have to be enum[] to int[] cast.
            // Can do any array of objects into arary of other type as long as the two types are compatible.
            var fooArray = new FooDerivedClass[]
            {
                new FooDerivedClass { fieldBaseA = "0.fieldBaseA", fieldBaseB = "0.fieldBaseB", fieldDerivedA = "0.fieldDerivedA", fieldDerivedB = "0.fieldDerivedB", },
                new FooDerivedClass { fieldBaseA = "1.fieldBaseA", fieldBaseB = "1.fieldBaseB", fieldDerivedA = "1.fieldDerivedA", fieldDerivedB = "1.fieldDerivedB", },
            };

            // OK, this does not compile
            //var barArray = (BarFlatClass[])fooArray;

            // But we still can
            var barArray = VeryUnsafeCast<FooDerivedClass[], BarFlatClass[]>.Cast(fooArray);

            // Everything should still work.
            Assert.Equal(fooArray.Length, barArray.Length);

            for (int i = 0; i < fooArray.Length; i++)
            {
                var foo = fooArray[i];
                var bar = barArray[i];

                Assert.Equal(foo.fieldBaseA, bar.fieldFlatA);
                Assert.Equal(foo.fieldBaseB, bar.fieldFlatB);
                Assert.Equal(foo.fieldDerivedA, bar.fieldFlatC);
                Assert.Equal(foo.fieldDerivedB, bar.fieldFlatD);
            }
        }
Exemplo n.º 2
0
        public void CalssHierarchy_CanCast_ToFlatClass()
        {
            // Having the source class FooDerivedClass which is part of the hierarchy:
            //    object
            //      --> FooBaseClass
            //              fieldA
            //              fieldB
            //          --> FooDerivedClass
            //              fieldC
            //              fieldD
            //
            // We can cast it to another "flat" class and accumulate all the fields:
            //      object
            //      --> BarFlatClass
            //          fieldA
            //          fieldB
            //          fieldC
            //          fieldD
            var fooDerived = new FooDerivedClass { fieldBaseA = "fieldBaseA", fieldBaseB = "fieldBaseB", fieldDerivedA = "fieldDerivedA", fieldDerivedB = "fieldDerivedB" };

            var bar = VeryUnsafeCast<FooDerivedClass, BarFlatClass>.Cast(fooDerived);
            Assert.Equal(fooDerived.fieldBaseA, bar.fieldFlatA);
            Assert.Equal(fooDerived.fieldBaseB, bar.fieldFlatB);
            Assert.Equal(fooDerived.fieldDerivedA, bar.fieldFlatC);
            Assert.Equal(fooDerived.fieldDerivedB, bar.fieldFlatD);
        }