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); } }
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); }