2012-12-11 58 views
0

我有以下簡單功能:指定類型的通用功能

private static Nullable<T> CastValue<T>(object val) 
where T : struct 
{ 
    if (!(val is DBNull)) 
    { 
     return (T) val; 
    } 
    return null; 
} 

我想叫它在遍歷這樣行/數據表中的列:

var table = CreateTable(); 
foreach (DataRow row in table.Rows) 
{ 
    foreach (DataColumn column in table.Columns) 
    { 
     Type type = column.DataType; 
     CastValue<type>(row[column]); 
    } 
} 

然而,我得到以下錯誤:

The type or namespace name 'type' could not be found (are you missing a using directive or an assembly reference?)

是否有一種方法來調用一個泛型函數與泛型參數在運行時間確定?

+1

Uppercase T dude .. on this:'CastValue (row [column]);'。這是你的「類型」無法找到錯誤的原因。至於你的主要問題..我認爲'動態'可能對你有幫助。 –

+2

@SimonWhitehead - 'type'是一個'Type'實例,而不是'Type'類。因爲'Type'不是struct,所以不會編譯。 – Lee

+0

@Lee True,但正如我所說..這是他發佈的錯誤的原因:) –

回答

1

您不能因爲泛型參數在編譯時解析,而列的類型只在運行時才知道。

既然你不什麼用的CastValue結果目前還不清楚你想要什麼來完成,但投應該是不必要的,因爲row[column]應當已經在列的數據類型的實例。


您可以與反思,但我看不出它如何幫助你的情況。

1

我認爲你需要做一個沒有通用版本的函數。如果你仔細想想,如果你傳遞的是錯誤的類型,那麼最終會產生一個運行時錯誤,所以你不能通過泛型來獲取任何東西。