Cloning an object using persistence
ClonableObj\TestApp\TestClass.cs
// Copyright 2012 ESRI
// 
// All rights reserved under the copyright laws of the United States
// and applicable international laws, treaties, and conventions.
// 
// You may freely redistribute and use this sample code, with or
// without modification, provided you include the original copyright
// notice and use restrictions.
// 
// See the use restrictions.
// 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;
using ClonableObj;

namespace TestApp
{
  public sealed class TestClass
  {
    #region class constructor (empty constructor)
    public TestClass()
    {

    }
    #endregion

    public void Test()
    {
      Console.WriteLine("Creating an instance of the clonable object.");
      ClonableObjClass cloneable = new ClonableObjClass();

      Console.WriteLine("Assigning properties");
      cloneable.SpatialReference = CreateGeographicSpatialReference();
      cloneable.Name = "test 1";
      cloneable.Point = new PointClass();
      cloneable.Point.PutCoords(35.02, 31.4);

      cloneable.ManagedArray = new ArrayList();
      cloneable.ManagedArray.Add("One");
      cloneable.ManagedArray.Add("Two");
      cloneable.ManagedArray.Add("Three");

      Console.WriteLine("New object's properties");
      Console.WriteLine("-----------------------");
      Console.WriteLine("Name: " + cloneable.Name);
      Console.WriteLine("ID: " + cloneable.ID.ToString());
      Console.WriteLine("Version: " + cloneable.Version.ToString());
      Console.WriteLine("Array values: ");
      foreach (object obj in cloneable.ManagedArray)
      {
        Console.WriteLine((string)obj);
      }
      Console.WriteLine("Spatial Reference parameters:");
      Console.WriteLine("Name: " + cloneable.SpatialReference.Name);
      IGeographicCoordinateSystem gcs = (IGeographicCoordinateSystem)cloneable.SpatialReference;
      Console.WriteLine("Alias: " + gcs.Alias);
      Console.WriteLine("Datum: " + gcs.Datum.Name);
      Console.WriteLine("");


      Console.WriteLine("Cloning the object...");
      ClonableObjClass clonee = cloneable.Clone() as ClonableObjClass;
      Console.WriteLine("");
      Console.WriteLine("Cloned object's properties:");
      Console.WriteLine("---------------------------");
      Console.WriteLine("Name: " + clonee.Name);
      Console.WriteLine("ID: " + clonee.ID.ToString());
      Console.WriteLine("Version: " + clonee.Version.ToString());
      Console.WriteLine("Array values: ");
      foreach (object obj in clonee.ManagedArray)
      {
        Console.WriteLine((string)obj);
      }
      Console.WriteLine("Spatial Reference parameters:");
      Console.WriteLine("Name: " + clonee.SpatialReference.Name);
      gcs = (IGeographicCoordinateSystem)clonee.SpatialReference;
      Console.WriteLine("Alias: " + gcs.Alias);
      Console.WriteLine("Datum: " + gcs.Datum.Name);
      Console.WriteLine("");

    }

    /// <summary>
    /// create a crazy coordinate system
    /// </summary>
    /// <returns></returns>
    private ISpatialReference CreateGeographicSpatialReference()
    {
      ISpatialReferenceFactory spatialRefFatcory = new SpatialReferenceEnvironmentClass();
      IGeographicCoordinateSystem geoCoordSys;
      geoCoordSys = spatialRefFatcory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);

      //assign a user defined datum to the SR (just for the test)
      IDatum datum = new DatumClass();
      IDatumEdit datumEdit = (IDatumEdit)datum;
      ISpheroid spheroid = spatialRefFatcory.CreateSpheroid((int)esriSRSpheroidType.esriSRSpheroid_Clarke1880);
      datumEdit.DefineEx("MyDatum", "My Datum", "MDTM", "", spheroid);

      IPrimeMeridian primeMeridian = spatialRefFatcory.CreatePrimeMeridian((int)esriSRPrimeMType.esriSRPrimeM_Greenwich);
      IAngularUnit angularUnits = spatialRefFatcory.CreateUnit((int)esriSRUnitType.esriSRUnit_Degree) as IAngularUnit;
      IGeographicCoordinateSystemEdit geoCoordSysEdit = (IGeographicCoordinateSystemEdit)geoCoordSys;
      geoCoordSysEdit.DefineEx("MyGeoCoordSys", "MyGeoCoordSys", "MGCS", "", "", datum, primeMeridian, angularUnits);

      geoCoordSys.SetFalseOriginAndUnits(-180.0, -180.0, 5000000.0);
      geoCoordSys.SetZFalseOriginAndUnits(0.0, 100000.0);
      geoCoordSys.SetMFalseOriginAndUnits(0.0, 100000.0);

      return geoCoordSys as ISpatialReference;
    }

  }
}