2011-10-26 75 views
1

我的問題在於,使用這樣的泛型函數有什麼負面影響?調用這個函數確實有效,並且在測試控制檯模塊中,它編譯得非常好。我知道這不是一個強類型的函數,並且是不好的練習。但它可以......完美地工作。像這樣的函數的目的是處理需要根據類型以特定格式插入的字符串輸入。我還在這裏閱讀了一些關於stackoverflow的其他問題,並提出了使用(Of T)函數以及類似變體的建議。爲什麼不這樣做?還是有另一種簡單的方法來完成這一點,而不需要創建一個完整的無類或大量的代碼。我知道這不是處理這個問題的「優雅」方式,所以如果任何人有建議,我都會聽。謝謝! :)使用這樣的泛型函數的負面影響?

Private Function ConvertFieldValueByType(ByVal type As Field_Type, ByVal value As  String) 

    If type = Field_Type.FIELD_TYPE_DATE Then 

     Dim dt As Date = DirectCast(TypeDescriptor.GetConverter(New Date(1990, 5, 6)).ConvertFrom(value), Date) 

     Return dt 

    ElseIf type = Field_Type.FIELD_TYPE_DATETIME Then 

     Dim dt As DateTime = DirectCast(TypeDescriptor.GetConverter(New DateTime(1990, 5, 6)).ConvertFrom(value), DateTime) 

     Return dt 

    ElseIf type = Field_Type.FIELD_TYPE_BLOB Then 

     Return value 

    ElseIf type = Field_Type.FIELD_TYPE_LIST Then 

     Return value 

    ElseIf type = Field_Type.FIELD_TYPE_LONG Then 

     Return Convert.ToInt64(value) 

    ElseIf type = Field_Type.FIELD_TYPE_NUMBER Then 

     Return Convert.ToInt32(value) 

    ElseIf type = Field_Type.FIELD_TYPE_SHORT Then 

     Return Convert.ToInt16(value) 

    ElseIf type = Field_Type.FIELD_TYPE_STRING Then 

     Return value 

    ElseIf type = Field_Type.FIELD_TYPE_TIME Then 

     Dim dt As DateTime = DirectCast(TypeDescriptor.GetConverter(New DateTime(1990, 5, 6)).ConvertFrom(value), DateTime) 

     Return dt 

    ElseIf type = Field_Type.FIELD_TYPE_UNKNOWN Then 

     Return value 

    Else 

     Return value 

    End If 

End Function 
+0

一旦它有'如果其他'全部功能,它是如何通用? –

+1

借調:我會在這裏避免使用「通用」一詞 - 該術語具有特定的含義,*不是這個*。 –

+0

我會說這受到http://en.wikipedia.org/wiki/God_object反模式 – rerun

回答

1

是的,有時候這樣的事情成爲必要,特別是如果最終類型沒有在編譯時已知(使大多數解決方案的尷尬)。我的主要反饋/觀察結果是:Field_Type看起來是一個枚舉,所以你可以用Switch使這個更整潔和更高效。重命名,我會大概調用的東西有關...Parse...,因爲它需要String(也許與匹配...Format...做相反),我認爲一些返回(特別是「blob」和「列表」)看起來有點可疑。但另有:它完成了工作。

次要點:你的GetConverter代碼可以採取而不必每次初始化一個結構;以C#術語,typeof(DateTime)

+0

謝謝你的洞察力。我會試一試你的建議。 – wakurth