About the Clonable object Sample
[C#]
ClonableObjClass.cs
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Collections;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Geometry;
namespace ClonableObject
{
/// <summary>
/// This call demonstrated an implementation of a hybrid colnable
/// class which has both .NET members as well as COM members.
/// </summary>
[Guid(ClonableObjClass.GUID)]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("ClonableObject.ClonableObjClass")]
public sealed class ClonableObjClass : IClone
{
#region different types of class members (COM and .NET)
public const string GUID = "0678ecf9-4066-4a61-94fb-45d6c4753826";
private int m_version = 1;
private ISpatialReference m_spatialRef = null;
private IPoint m_point = null;
private string m_name = string.Empty;
private ArrayList m_arr = null;
private Guid m_ID;
#endregion
#region class constructor
public ClonableObjClass()
{
m_ID = Guid.NewGuid();
m_spatialRef = new UnknownCoordinateSystemClass();
}
#endregion
#region public class properties
public string Name
{
get { return m_name; }
set { m_name = value; }
}
public int Version
{
get { return m_version; }
}
public ISpatialReference SpatialReference
{
get { return m_spatialRef; }
set { m_spatialRef = value; }
}
public Guid ID
{
get { return m_ID; }
}
public IPoint Point
{
get { return m_point; }
set { m_point = value; }
}
public ArrayList ManagedArray
{
get { return m_arr; }
set { m_arr = value; }
}
#endregion
#region IClone Members
/// <summary>
/// Assigns the properties of src to the receiver.
/// </summary>
/// <param name="src"></param>
public void Assign(IClone src)
{
//1. make sure that src is pointing to a valid object
if (null == src)
{
throw new COMException("Invalid objact.");
}
//2. make sure that the type of src is of type 'ClonableObjClass'
if (!(src is ClonableObjClass))
{
throw new COMException("Bad object type.");
}
//3. assign the properties of src to the current instance
ClonableObjClass srcClonable = (ClonableObjClass)src;
m_name = srcClonable.Name;
m_version = srcClonable.Version;
m_ID = new Guid(srcClonable.ID.ToString());
//don't clone the spatial reference, since in this case we want both object to
//reference the same spatial reference (for example like features in a featureclass
//which share the same spatial reference)
m_spatialRef = srcClonable.SpatialReference;
//clone the point. Use deep cloning
if (null == srcClonable.Point)
m_point = null;
else
{
IObjectCopy objectCopy = new ObjectCopyClass();
object obj = objectCopy.Copy((object)srcClonable.Point);
m_point = (IPoint)obj;
}
m_arr = (ArrayList)srcClonable.ManagedArray.Clone();
}
/// <summary>
/// Clones the receiver and assigns the result to clonee.
/// <returns></returns>
public IClone Clone()
{
//create a new instance of the object
ClonableObjClass obj = new ClonableObjClass();
//assign the properties of the new object with the current object's properties.
//according to each 'Ref' property, the user need to decide whether to use deep cloning
//or shallow cloning.
obj.Assign(this);
return (IClone)obj;
}
/// <summary>
/// Returns TRUE when the receiver and the other object have the same properties.
/// </summary>
/// <param name="other"></param>
/// <returns></returns>
public bool IsEqual(IClone other)
{
//1. make sure that the 'other' object is pointing to a valid object
if (null == other)
throw new COMException("Invalid objact.");
//2. verify the type of 'other'
if (!(other is ClonableObjClass))
throw new COMException("Bad object type.");
ClonableObjClass otherClonable = (ClonableObjClass)other;
//test that all ot the object's properties are the same.
//please note the usage of IsEqual when using arcobjects components that
//supports cloning
if (otherClonable.Version == m_version &&
otherClonable.Name == m_name &&
otherClonable.ID == m_ID &&
otherClonable.ManagedArray == m_arr &&
((IClone)otherClonable.SpatialReference).IsEqual((IClone)m_spatialRef) &&
((IClone)otherClonable.Point).IsEqual((IClone)m_point))
return true;
return false;
}
public bool IsIdentical(IClone other)
{
//1. make sure that the 'other' object is pointing to a valid object
if (null == other)
throw new COMException("Invalid objact.");
//2. verify the type of 'other'
if (!(other is ClonableObjClass))
throw new COMException("Bad object type.");
//3. test if the other is the 'this'
if ((ClonableObjClass)other == this)
return true;
return false;
}
#endregion
}
}
[Visual Basic .NET]
ClonableObjClass.vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Collections
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.SystemUI
Imports ESRI.ArcGIS.Geometry
''' <summary>
''' This call demonstrated an implementation of a hybrid colnable
''' class which has both .NET members as well as COM members.
''' </summary>
<Guid(ClonableObjClass.GUIDVAL), ClassInterface(ClassInterfaceType.None), ProgId("ClonableObject.ClonableObjClass")> _
Public NotInheritable Class ClonableObjClass
Implements IClone
#Region "different types of class members (COM and .NET)"
Public Const GUIDVAL As String = "0678ecf9-4066-4a61-94fb-45d6c4753826"
Private m_version As Integer = 1
Private m_spatialRef As ISpatialReference = Nothing
Private m_point As IPoint = Nothing
Private m_name As String = String.Empty
Private m_arr As ArrayList = Nothing
Private m_ID As Guid
#End Region
#Region "class constructor"
Public Sub New()
m_ID = Guid.NewGuid()
m_spatialRef = New UnknownCoordinateSystemClass()
End Sub
#End Region
#Region "public class properties"
Public Property Name() As String
Get
Return m_name
End Get
Set(ByVal value As String)
m_name = value
End Set
End Property
Public ReadOnly Property Version() As Integer
Get
Return m_version
End Get
End Property
Public Property SpatialReference() As ISpatialReference
Get
Return m_spatialRef
End Get
Set(ByVal value As ISpatialReference)
m_spatialRef = value
End Set
End Property
Public ReadOnly Property ID() As Guid
Get
Return m_ID
End Get
End Property
Public Property Point() As IPoint
Get
Return m_point
End Get
Set(ByVal value As IPoint)
m_point = value
End Set
End Property
Public Property ManagedArray() As ArrayList
Get
Return m_arr
End Get
Set(ByVal value As ArrayList)
m_arr = value
End Set
End Property
#End Region
#Region "IClone Members"
''' <summary>
''' Assigns the properties of src to the receiver.
''' </summary>
''' <param name="src"></param>
Public Sub Assign(ByVal src As IClone) Implements IClone.Assign
'1. make sure that src is pointing to a valid object
If Nothing Is src Then
Throw New COMException("Invalid objact.")
End If
'2. make sure that the type of src is of type 'ClonableObjClass'
If Not (TypeOf src Is ClonableObjClass) Then
Throw New COMException("Bad object type.")
End If
'3. assign the properties of src to the current instance
Dim srcClonable As ClonableObjClass = CType(src, ClonableObjClass)
m_name = srcClonable.Name
m_version = srcClonable.Version
m_ID = New Guid(srcClonable.ID.ToString())
'don't clone the spatial reference, since in this case we want both object to
'reference the same spatial reference (for example like features in a featureclass
'which share the same spatial reference)
m_spatialRef = srcClonable.SpatialReference
'clone the point. Use deep cloning
If Nothing Is srcClonable.Point Then
m_point = Nothing
Else
Dim objectCopy As IObjectCopy = New ObjectCopyClass()
Dim obj As Object = objectCopy.Copy(CObj(srcClonable.Point))
m_point = CType(obj, IPoint)
End If
m_arr = CType(srcClonable.ManagedArray.Clone(), ArrayList)
End Sub
''' <summary>
''' Clones the receiver and assigns the result to clonee.
''' <returns></returns>
Public Function Clone() As IClone Implements IClone.Clone
'create a new instance of the object
Dim obj As ClonableObjClass = New ClonableObjClass()
'assign the properties of the new object with the current object's properties.
'according to each 'Ref' property, the user need to decide whether to use deep cloning
'or shallow cloning.
obj.Assign(Me)
Return CType(obj, IClone)
End Function
''' <summary>
''' Returns TRUE when the receiver and the other object have the same properties.
''' </summary>
''' <param name="other"></param>
''' <returns></returns>
Public Function IsEqual(ByVal other As IClone) As Boolean Implements IClone.IsEqual
'1. make sure that the 'other' object is pointing to a valid object
If Nothing Is other Then
Throw New COMException("Invalid objact.")
End If
'2. verify the type of 'other'
If Not (TypeOf other Is ClonableObjClass) Then
Throw New COMException("Bad object type.")
End If
Dim otherClonable As ClonableObjClass = CType(other, ClonableObjClass)
'test that all ot the object's properties are the same.
'please note the usage of IsEqual when using arcobjects components that
'supports cloning
If otherClonable.Version = m_version AndAlso otherClonable.Name = m_name AndAlso otherClonable.ID = m_ID AndAlso otherClonable.ManagedArray Is m_arr AndAlso (CType(otherClonable.SpatialReference, IClone)).IsEqual(CType(m_spatialRef, IClone)) AndAlso (CType(otherClonable.Point, IClone)).IsEqual(CType(m_point, IClone)) Then
Return True
End If
Return False
End Function
Public Function IsIdentical(ByVal other As IClone) As Boolean Implements IClone.IsIdentical
'1. make sure that the 'other' object is pointing to a valid object
If Nothing Is other Then
Throw New COMException("Invalid objact.")
End If
'2. verify the type of 'other'
If Not (TypeOf other Is ClonableObjClass) Then
Throw New COMException("Bad object type.")
End If
'3. test if the other is the 'this'
If CType(other, ClonableObjClass) Is Me Then
Return True
End If
Return False
End Function
#End Region
End Class