Thursday, May 03, 2007

A generic cloning method

Hey all,

As you know I'm big on Reflection, and big on Generics...now, here's a method that combines the two for a neat little cloning tool.

Let's assume we have a base object we use for objects, and let's call it DataObject.  Anything can derive from this object, and in addition, I'm going to add the following method to allow me to "clone" the properties of my current object onto the properties of any other object, provided the Name and Type of the property match.

Notice that I am using the generic t notation for a generic object, and this becomes a generic method.

public class DataObject

{

public t Clone<t>()
{
     //reflection based clone
     Type tType = typeof(t);

     t item = (t) Activator.CreateInstance(tType);

     PropertyInfo[] props = tType.GetProperties();

     foreach (PropertyInfo prop in props)
     {
          try
          {
                 prop.SetValue(item, prop.GetValue(this, null), null);
          }
          catch { }
     }  

     return item;
}

}

 

Ok, now that that's done, let's create two more classes, a Dog, and a Cat.

 

public class Cat : DataObject

{

private string _name;

public string Name

{

    get { return _name;}

    set { _name = value;}

}

private string _color;

public string Color

{

    get { return _color;}

    set { _color= value;}

}

}

public class Dog : DataObject

{

private string _name;

public string Name

{

    get { return _name;}

    set { _name = value;}

}

private string _color;

public string Color

{

    get { return _color;}

    set { _color= value;}

}

}

 

Ok, let's create a Cat.

Cat cat = new Cat();

cat.Name = "Fluffy";

cat.Color = "Orange";

Now that we have that, we can create a Dog from the Cat:

Dog dog = cat.Clone<Dog>();

Once this method is called, the dog will have the exact same properties as the cat...this is useful in particular if you are adjusting properties on objects that are similar enough while in a loop (for example, you are looping on creating email objects that you are placing in a list) and you find yourself in a position where just overriding the properties on the current object won't work.

Happy cloning!

 

Rob