我必须从DB导出到CSV。 ( .NET 2 )
field; fileld; field... etc
有3种类型的字段: Alpha ,数字和 Bool 表示为"alphaValue"
,intValue
和{ {1}}。
我尝试将其封装在 字段集合 中,以便导出if alpha然后设置“”,如果Bool => True / False,如果数字设为是
并尝试构建True/False
类:
CsvField
可能的用法:
Public Structure?Class CsvField(Of T As ???)
End Structure
Enum FieldType
Alpha
Bool
Numeric
End Enum
欢迎任何建议。
答案 0 :(得分:2)
不需要泛型。只需使用继承:
' 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
...
代码示例假定value
存储字段的实际值。我希望这个例子足够清楚。使您的字段集合为类型基类类型,例如List(Of CsvField)
。然后它也可以包含所有派生类型的对象。
顺便说一句,请注意,在使用polymorphism时,您可以完全摆脱FieldType
枚举以及所有决定的If
/ Select Case
构造该怎么做取决于字段类型。如果您仍然需要这样做,可以替换:
If someCsvField.FieldType = Alpha Then ...
与
If TypeOf someCsvField Is AlphaCsvField Then ...
但是,您通常应该能够将此类逻辑移动到派生类中,并通过重写方法来删除If
语句。这是上述例子的全部要点。
P.S。:如果您想知道如何创建CsvField
对象而未明确检查类型。一种方法是使用工厂方法和方法重载:
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
例如,CsvField.Create(False)
会将BoolCsvField
“伪装”为CsvField
,以便您可以将其放入List(Of CsvField)
或您拥有的任何集合中。< / p>