2011-12-14 28 views
1

我有一個通用的類,我用來保存從數據庫加載的信息。如果在寫入時所有類型都未知,則將值類型轉換爲泛型對象中的(可能)可枚舉枚舉類型?

我有這需要一個DataRow作爲參數,使用對象的已知列名,而DataRow中提取數據的方法,使得:

Dim loadData As T = CType(myDataRow("myColumnName"), T)) 

作品,因爲在大多數情況下,我的默認分配。

不幸的是,由於一些可怕的設計約束,我的一些列可能爲空,也可能從枚舉中獲取。

這意味着當<T>Nullable(Of SomeEnumeration)上面的代碼不起作用,因爲我不能將0直接投到SomeEnumeration.Zero

有沒有辦法檢查<T>是不是Nullable(Of [Enum])?或者用某種方法寫出一個允許Integers轉換成Nullable(Of [Enum])的方法?

我覺得我忘記了一些可以讓我寫出其中一個的東西,但是我的軟弱谷歌卻什麼都沒有變。

編輯:好,這要歸功於以下dasblinkenlight的回答,我可以當這種情況發生時檢測,但我現在需要做的是採取一種<T>這是我所知道的是Nullable(Of SomeClass),得到一種參考SomeClass然後創建一個類型爲Nullable(Of SomeClass)的新對象並將其分配給LoadData。

我嘗試的一切都分崩離析。有任何想法嗎?

編輯2:

我爲獲得該枚舉值的價值的解決方案是:

Dim baseType As Type = Nullable.GetUnderlyingType(GetType(T)) 
loadData = [Enum].Parse(baseType, dataRowIn(Me._dataName)) 

我的問題是,我有很多困難,在尋找這將接受baseType任何功能作爲一個實際的類型。

[Enum] .Parse接受baseType作爲參數,我知道baseType是一個[Enum]類型,因爲dasblinkenlight的代碼,所以在這種情況下,我可以編寫一個解決方案。這是一個對我的問題非常具體的解決方案(即,TNullable(of SomeEnumeration)),但它仍是一個解決方案。

+0

http://stackoverflow.com/a/5199474/284240 – 2011-12-14 13:26:58

+0

從其他SO貼子,這是值得一讀http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/ representation-and-identity.aspx – 2011-12-14 13:41:33

回答

1

我不是在VB的語法很不錯,但你知道,什麼是可爲空(中[枚舉])時,該條件爲真:

GetType(T).IsGenericType AndAlso 
GetType(T).GetGenericTypeDefinition() = GetType(Nullable(Of)) AndAlso 
GetType(T).GetGenericArguments()(0).IsEnum 

編輯:糾正語法(再次)

2

假設myDataRow("myColumnName")返回Object,那個對象將是Nullable(Of SomeEnumeration)你可以有;

Sub Main 
    Dim items(2) As Object 
    items(0) = DayOfWeek.Monday 
    items(1) = Nothing 

    Test (items(0)) 
    Test (items(1)) 
End Sub 

Sub Test (value As Object) 
    Dim typedValue = CType(value, DayOfWeek?) 
    Dim notNullValue As DayOfWeek = If(typedValue, DayOfWeek.Sunday) 

    Console.WriteLine ("Nullable = {0:g}, NotNull = {1:g}", typedValue, notNullValue) 
End Sub 

假設myDataRow("myColumnName")回報Object和對象將是Nullable(Of Integer)你可以有;

Sub Main 
    Dim items(2) As Object 
    items(0) = 1 
    items(1) = Nothing 

    Test (items(0)) 
    Test (items(1)) 
End Sub 

Sub Test (value As Object) 
    Dim intValue = CType(value, Integer?) 
    Dim typedValue = CType(intValue, DayOfWeek?) 
    Dim notNullValue As DayOfWeek = If(typedValue, DayOfWeek.Sunday) 

    Console.WriteLine ("Nullable = {0:g}, NotNull = {1:g}", typedValue, notNullValue) 
End Sub 

這部作品的原因,並從Object直投地Nullable(Of DayOfWeek)失敗,是因爲沒有從ObjectDayOfWeek沒有類型轉換,但然而,有來自Integer類型轉換到DayOfWeek,所以我們必須先轉換爲實際類型(Integer)然後是枚舉類型。

如果試圖施放Object是一個Integer直接到Short因爲沒有類型轉換,從ObjectShort你會得到同樣的錯誤。在那裏鑄造到Integer然後到Short將工作。

Dim x As Integer = 5 

' Fails 
CType(x, Short) 

'Works 
CType(CType(x, Integer), Short) 

關鍵的區別是CType(someInteger, Short)CType(someInteger, DayOfWeek)實際上並不鑄造,相反,它是使用顯式轉換。恰好如此,相同的語法/關鍵字用於強制轉換和顯式轉換。