2009-12-01 88 views
0

我創建了一個名爲CustomData的類,它使用另一個名爲CustomOptions作爲其字段之一。我想在DataTable中使用CustomData作爲值。這裏有一個簡短的概述(簡化,字段是private和訪問器public,大部分是隻讀的,set是由定製方法完成的);數據表和自定義類型

enum CustomDataOptionType 
{ 
// Some values, not important 
} 

class CustomOptions 
{ 
public CustomDataOptionType type { get; } 
public Dictionary<string, string> values { get; } 
// Some Methods to set the values 
} 

class CustomData 
{ 
public CustomOptions options { get; } 
// Some Methods to set the options 
} 

所以,在使用以上這樣的「實際」類,我創建一個DataTable,使用是typeof(CustomData)列。

但是,當我嘗試訪問列時,例如通過

DataRow Row = data.Rows.Find("bla"); 
Row["colmn1"].options; // Not possible 

爲什麼我不能訪問options字段?

回答

3

由於Row["column1"] returns 「對象」。 您需要的值轉換爲你的類型:

((CustomData)Row["column1"]).Options. 

編輯: 如果你想處理NULL值,你應該使用這樣的:

CustomData data = Row["column1"] as CustomData; 
if (null != data) { 
    // do what you want 
} 

或者你可以使用一個擴展簡化它的方法:

public static DataRowExtensionsMethods { 
    public static void ForNotNull<T>(this DataRow row, string columnName, Action<T> action) { 
     object rowValue = row[columnName]; 
     if (rowValue is T) { 
      action((T)rowValue); 
     } 
    } 
} 
// somewhere else 
Row.ForNotNull<CustomData>("column1", cutomData => this.textBox1.Text = customData.Username); 
+0

該代碼假設你死定了類型在該列是正確的。 – 2009-12-01 10:51:10

+0

如果將colum的DataType設置爲「typeof(CustomData)」,那麼只能存在表示「NULL」值的「CustomData」和/或「DBNull」。 – TcKs 2009-12-01 10:51:49

+0

@ ApoY2k:如果你可以確保和/或確實像TcKs提到的那樣,那麼你很安全:) – 2009-12-01 11:01:47

1

您需要將其轉換成類型CustomData

((CustomData)Row["colmn1"]).options