Vista la frequenza con cui l'argomento emerge nelle chiacchierate "informatiche" su .NET, per chi non può ancora gustarsi i generics, posto la macro che utilizzo io in VB.NET 1.1 per creare le collection tipizzate. La macro è basata sull'esempio di MSDN per CollectionBase.
Posizionate il cursore tra Class MiaClasse ed End Class e fate partire la macro.
Sub CreateCollection()
If DTE.ActiveDocument.Selection Is Nothing Then
System.Windows.Forms.MessageBox.Show("You must have the text editor open to execute this macro!", "WriteSimpleVBProperty", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation, System.Windows.Forms.MessageBoxDefaultButton.Button1)
Exit Sub
End If
Dim entityName As String = InputBox(String.Format("Enter the entity class name:{0}(eg. Customer)", System.Environment.NewLine), "CreateCollection", String.Empty)
If entityName = String.Empty Then Exit Sub
Dim entityFullName As String = InputBox(String.Format("Enter the entity class fullname:{0}(eg. MyCompanyName.MyProject.Entities.Customer)", System.Environment.NewLine), "CreateCollection", String.Empty)
If entityFullName = String.Empty Then Exit Sub
Dim sb As New System.Text.StringBuilder
sb.Append(" Inherits CollectionBase")
sb.Append(System.Environment.NewLine)
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Default Public Property Item(ByVal index As Integer) As {0}", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" Get")
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Return DirectCast(List(index), {0})", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" End Get")
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Set(ByVal Value As {0})", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" List(index) = Value")
sb.Append(System.Environment.NewLine)
sb.Append(" End Set")
sb.Append(System.Environment.NewLine)
sb.Append(" End Property")
sb.Append(System.Environment.NewLine)
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Public Function Add(ByVal value As {0}) As Integer", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" Return List.Add(value)")
sb.Append(System.Environment.NewLine)
sb.Append(" End Function 'Add")
sb.Append(System.Environment.NewLine)
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Public Function IndexOf(ByVal value As {0}) As Integer", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" Return List.IndexOf(value)")
sb.Append(System.Environment.NewLine)
sb.Append(" End Function 'IndexOf")
sb.Append(System.Environment.NewLine)
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Public Sub Insert(ByVal index As Integer, ByVal value As {0})", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" List.Insert(index, value)")
sb.Append(System.Environment.NewLine)
sb.Append(" End Sub 'Insert")
sb.Append(System.Environment.NewLine)
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Public Sub Remove(ByVal value As {0})", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" List.Remove(value)")
sb.Append(System.Environment.NewLine)
sb.Append(" End Sub 'Remove")
sb.Append(System.Environment.NewLine)
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Public Function Contains(ByVal value As {0}) As Boolean", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" ' If value is not of type {0}, this will return false.", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" Return List.Contains(value)")
sb.Append(System.Environment.NewLine)
sb.Append(" End Function 'Contains")
sb.Append(System.Environment.NewLine)
sb.Append(System.Environment.NewLine)
sb.Append(" Protected Overrides Sub OnInsert(ByVal index As Integer, ByVal value As [Object])")
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" If Not value.GetType() Is GetType({0}) Then", entityFullName))
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Throw New ArgumentException(""value must be of type {0}."", ""value"")", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" End If")
sb.Append(System.Environment.NewLine)
sb.Append(" End Sub 'OnInsert")
sb.Append(System.Environment.NewLine)
sb.Append(System.Environment.NewLine)
sb.Append(" Protected Overrides Sub OnRemove(ByVal index As Integer, ByVal value As [Object])")
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" If Not value.GetType() Is GetType({0}) Then", entityFullName))
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Throw New ArgumentException(""value must be of type {0}."", ""value"")", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" End If")
sb.Append(System.Environment.NewLine)
sb.Append(" End Sub 'OnRemove")
sb.Append(System.Environment.NewLine)
sb.Append(System.Environment.NewLine)
sb.Append(" Protected Overrides Sub OnSet(ByVal index As Integer, ByVal oldValue As [Object], ByVal newValue As [Object])")
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" If Not newValue.GetType() Is GetType({0}) Then", entityFullName))
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Throw New ArgumentException(""value must be of type {0}."", ""newValue"")", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" End If")
sb.Append(System.Environment.NewLine)
sb.Append(" End Sub 'OnSet")
sb.Append(System.Environment.NewLine)
sb.Append(System.Environment.NewLine)
sb.Append(" Protected Overrides Sub OnValidate(ByVal value As [Object])")
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" If Not value.GetType() Is GetType({0}) Then", entityFullName))
sb.Append(System.Environment.NewLine)
sb.Append(String.Format(" Throw New ArgumentException(""value must be of type {0}."")", entityName))
sb.Append(System.Environment.NewLine)
sb.Append(" End If")
sb.Append(System.Environment.NewLine)
sb.Append(" End Sub 'OnValidate")
sb.Append(System.Environment.NewLine)
Try
DTE.ActiveDocument.Selection.TopPoint.CreateEditPoint.Insert(sb.ToString)
Catch ex As System.Exception
System.Windows.Forms.MessageBox.Show(ex.Message, "CreateCollection", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error, System.Windows.Forms.MessageBoxDefaultButton.Button1)
End Try
End Sub