动态字段类型处理

时间:2010-04-02 10:13:27

标签: .net generics oop .net-2.0 csv

我必须从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

欢迎任何建议。

1 个答案:

答案 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>