2010-04-02 4 views
1

Je dois faire une exportation de DB vers CSV. (.NET 2)Gestion du type de champ dynamique

field; fileld; field... etc 

ont 3 types de champs: Alpha, numérique et Bool respresented comme "alphaValue", intValue et True/False.

J'essaie de résumer cela dans un champs collection, afin d'exporter si alpha puis réglez « », si Bool => Vrai/Faux si let numérique tel quel.

et essayer de construire une classe CsvField:

Public Structure?Class CsvField(Of T As ???) 

    End Structure 

    Enum FieldType 
    Alpha 
    Bool 
    Numeric 
    End Enum 

utilisation possibile:

myCollection.Add(new CsvField(DateTime.Now, FileType.Alpha)) 
myCollection.Add(new CsvField(myInt, FileType.Numeric)) 

des suggestions accueillies avec satisfaction.

Répondre

2

Aucun générique requis. Il suffit d'utiliser l'héritage:

' abstract base class; you could possibly declare it as an interface instead: ' 
MustInherit Class CsvField 
    Public MustOverride Function Export() As String 
End Class 


' specialized class for alpha-numeric fields: ' 
Class AlphaCsvField : Inherits CsvField 
    ... 
    Public Overrides Function Export() As String 
     Return String.Format("""{0}""", value) 
    End Function 

    Private value As String 
End Class 


' specialized class for bool fields ' 
Class BoolCsvField : Inherits CsvField 
    ... 
    Public Overrides Function Export() As String 
     If value = True Then 
      Return "True" 
     Else 
      Return "False" 
     End If 
    End Function 

    Private value As Boolean 
End Class 

... 

L'exemple de code suppose que value stocke la valeur réelle d'un champ. J'espère que cet exemple est suffisamment clair. Créez une collection de champs pour le type de classe de base de type, par ex. List(Of CsvField). Il peut aussi contenir des objets de tous les types dérivés.


btw., Notez comment, lors de l'utilisation polymorphism, vous pourriez être en mesure de se débarrasser de l'énumération FieldType complètement et toutes les constructions If/Select Case qui décident de ce qu'il faut faire en fonction du type de terrain. Si vous avez encore besoin de le faire, vous pouvez remplacer:

If someCsvField.FieldType = Alpha Then ... 

avec

If TypeOf someCsvField Is AlphaCsvField Then ... 

Cependant, vous devez généralement être en mesure de déplacer cette logique dans les classes dérivées et de se débarrasser des If déclarations méthodes dominantes. C'est tout le point de l'exemple ci-dessus.


P.S .: Si vous vous demandez comment vous créez vos objets CsvField sans vérifier explicitement le type. Une façon est d'utiliser des méthodes d'usine et la surcharge de méthode:

MustInherit Class CsvField 

    Public Shared Function Create(value As String) As CsvField 
     Return New AlphaCsvField(value) 
    End 

    Public Shared Function Create(value As Boolean) As CsvField 
     Return New BoolCsvField(value) 
    End 

    ... 

    ' as in the above code example ' 
    Public MustOverride Function Export() As String 

End Class 

Par exemple, CsvField.Create(False) créerait un BoolCsvField « déguisé » comme CsvField, de sorte que vous pouvez le mettre dans votre List(Of CsvField) ou tout autre collection que vous avez.

+0

est le polymorphisme plus de ressources et de temps qu'une simple classe avec le type? – serhio

+0

@serhio non, il n'y a pas de pénalité de ressources ou de performances lors de l'utilisation de l'héritage et du polymorphisme. –

+0

@serhio: Non, ou au moins la surcharge * memory * supplémentaire serait si petite qu'elle serait insignifiante dans votre cas (très probablement).Runtime * performance * pourrait même s'améliorer très légèrement. Ne t'inquiète pas pour ça. L'utilisation de l'héritage se traduira par un code mieux structuré, plus facile à lire et donc plus facile à maintenir, ce qui est plus important que quelques octets utilisés en mémoire. Si vous êtes toujours intéressé par la raison, je peux fournir plus de détails à la demande. – stakx

Questions connexes