I favor an approach like EG's however with a little bit more since i'm utterly spoiled by the intuitiveness of the VS IDE. You can get his shared properties approach to behave in the IDE as a true enum like the Color and Pen classes:-
vbnet Code:
  1. ''' <completionlist cref="DefaultMasks"/>
  2. Public Class DefaultMasks
  3.     Private _mask As String
  4.     Private Sub New(ByVal mask As String)
  5.         _mask = mask
  6.     End Sub
  7.  
  8.     Public Shared ReadOnly Property PhoneNumber() As DefaultMasks
  9.         Get
  10.             Return New DefaultMasks("(999)000-0000")
  11.         End Get
  12.     End Property
  13.     Public Shared ReadOnly Property ZipCode() As DefaultMasks
  14.         Get
  15.             Return New DefaultMasks("00000-9999")
  16.         End Get
  17.     End Property
  18.     Public Shared Widening Operator CType(ByVal dm As DefaultMasks) As String
  19.         Return dm._mask
  20.     End Operator
  21.  
  22. End Class
The key to making this work is the completionlist tag above the class declarations. Notice that ive also made a couple of adjustments to EG's example. First I have the properties return a DefaultMasks object instead of a string so we can declare a variable as DefaultMasks without provoking a type mismatch. Ive also overriden the assignment operator so you can assign an object of type DefaultMasks directly to a string as:-
vbnet Code:
  1. Dim dm As DefaultMasks = DefaultMasks.PhoneNumber
  2.  
  3. Dim s As String = dm
However, it may be better to override the ToString method of the class to make this assignment more explicit and obvious to anyone reading the code.