Creating Enumerations of Items with a Certain Arbitrary Data Type
.NET does not allow defining enumerations of arbitrary types. In some situations an enumeration of predefined values/objects is needed. The code below creates an enumeration of type String
called ClipboardType
. The design follows the pattern that is used in the .NET Framework class library, for example, for the Color
type:
''' <completionlist cref="ClipboardType"/>
Public Structure ClipboardType
Private Shared ReadOnly m_Rtf As New ClipboardType("RTF")
Private Shared ReadOnly m_Bitmap As New ClipboardType("Bitmap")
Private Shared ReadOnly m_Text As New ClipboardType("Text")
Public Shared ReadOnly Property Rtf() As ClipboardType
Get
Return m_Rtf
End Get
End Property
Public Shared ReadOnly Property Bitmap() As ClipboardType
Get
Return m_Bitmap
End Get
End Property
Public Shared ReadOnly Property Text() As ClipboardType
Get
Return m_Text
End Get
End Property
Private Sub New(ByVal Value As String)
m_Value = Value
End Sub
Private m_Value As String
' Alternatively, we could implement a read-only 'Value' property or
' something similar.
Public Overrides Function ToString() As String
Return m_Value
End Function
Public Overloads Overrides Function Equals( _
ByVal obj As Object _
) As Boolean
Return _
DirectCast(obj, ClipboardType).ToString() = m_Value
End Function
' '=' Operator overloading code goes here (Visual Basic 2005).
End Structure
Usage:
Public Sub Foo(ByVal c As ClipboardType)
MsgBox(c.Equals(ClipboardType.Rtf))
MsgBox(c.Equals(ClipboardType.Bitmap))
MsgBox(c.ToString()) ' Get the value.
End Sub
Public Sub Test()
Foo(ClipboardType.Bitmap)
End Sub
IntelliSense support in Visual Studio 2005 similar to enumeration types is achieved by adding the completionlist
XML comment to the class. The cref
attribute takes the type whose shared members should be shown in the IntelliSense list. completionlist
is undocumented but is treated correctly by the Visual Basic and C# compilers of Visual Studio 2005.