public static void TestIsAndAs() { SerializableObject sobj = new Umbrella(); //... //sr.SerializeToFile(...); //sr.Price = 200; ChangeObject(ref sobj); // Using "is". if (sobj is Umbrella) { Umbrella um = (Umbrella)sobj; um.Price = 200; um.Ean = "123468904"; um.Type = "automatic"; } // Using "is". if (sobj is StockItem) { StockItem si = (StockItem)sobj; si.Price = 200; // Uncommenting this line causes a compile-time error. // A StockItem might be an umbrella, but it may also be an anorak, a pencil, whatever we sell on our e-shop. //si.Type = "automatic"; } // Using "as". Anorak anorak = sobj as Anorak; if (anorak != null) { Console.WriteLine(anorak.Size); } // Using "as". // This compiles fine because SerializableObject and UserPreferences have a relationship "ancestor-descendant". UserPreferences preferences = sobj as UserPreferences; if (preferences != null) { preferences.Theme = Theme.Orange; } // Using "as". // This compiles fine because SerializableObject and StockItem have a relationship "ancestor-descendant". StockItem item = sobj as StockItem; if (item != null) { // The following lines do NOT compile because StockItem and UserPreferences do NOT have a relationship "ancestor-descendant". // The two types lie in different branches of the object hierarchy. //UserPreferences up = item as UserPreferences; //up.IsConfirmDelete = false; } }
private static void ChangeObject(ref SerializableObject obj) { obj = new Anorak(); }