2011-07-04 85 views
1

我試圖實現一個表,將其分成3個級別。C中的泛型問題#

class Field -> 
     class Record (witch holds a collection of fields) -> 
       class Table(witch holds a collection of Records) 

現在我的問題是不正確的方式來構造這個實現,雖然任何指針都會受到歡迎。

iv'e有一個問題與實現一個通用類領域

public class Field<T> 
{ 
    T value; 
    Type _type; 
    string _header; 
} 

我不知道是什麼類型T會的,所以我需要定義與我」, 現在的問題類米麪對的是記錄中的類集合將最有可能持有的不同類型的牛逼和這有點兒違背了所有目的

public class Record 
{ 
    List<Field<object>> fields ;   
} 

所以現在我需要將T轉換爲對象,因爲T不會是特定的類型。

任何想法的工作圍繞此接受下垂所有的泛型概念和定義值爲對象,將不勝感激。

加上我的想法實現任何指針

我的表提前由

class Table 
    { 
      KeyValuePair<string,Type>[] columns ; 
      KeyValuePair<string, Type> primary_key; 
      string entitie_name ; 
      List<Reocrd> records ; 
    } 
    // the Record class could be created only from a table template just like a datarow 
    public class Record 
    { 
      List<Field<object>> fields ; 
      string primary_key ;// the name of the field witch i use to extract a value    
    } 

10倍。

+3

你似乎是重新發明輪子呢? –

+0

單靠仿製藥無法做到這一點。您將需要:a)爲您的班級的用戶承擔責任,要求提供特定類型的數據,或者b)使用代碼生成功能從您的數據庫創建非泛型班級,或c)使用反思。 – Jon

+0

這可能是一個天真的問題,但你爲什麼要創建似乎模仿ado.net數據表和對象的數據行(可能是datacolumn?)? – adrianos

回答

2

你可以在.NET Framework通常找到一個模式是定義一個非泛型基類或接口:

public abstract class Field 
{ 
    protected Field() { } 

    public abstract BoxedValue { get; set; } 

    public abstract Type ValueType { get; } 
} 

public class Field<T> : Field 
{ 
    private T value; 

    public Field(T value) { this.value = value; } 

    public T Value 
    { 
     get { return this.value; } 
     set { this.value = value;; } 
    } 

    public override object BoxedValue 
    { 
     get { return this.value; } 
     set { this.value = (T)value; } 
    } 

    public override Type ValueType 
    { 
     get { return typeof(T); } 
    } 
} 

記錄類公開非通用領域的集合:

public class Record 
{ 
    public IEnumerable<Field> Fields { get { ... } } 
} 

如果代碼需要得到字段的值,而不拳擊,它需要Field實例強制轉換爲匹配字段<牛逼>第一。

例子:

foreach (Field<int> field in record.Fields.OfType<Field<int>>()) 
{ 
    int value = field.Value; 
    Console.WriteLine(value); 
} 
+0

10倍,這使我在正確的道路上只有2件事我不明白, (1):你不能有兩個類名爲字段 (2):從什麼時候抽象類包含約束器 –

+0

1.如果通用參數的數量不同,則可以有兩個名爲Field的類。 2.抽象類可以有構造函數,儘管它們不能被實例化。 – dtb

0

我傾向於使用接口,這裏

IField ......讓使用該

泛型類繼承。然後關閉此與

IField接口

現在你可以有一個實際上包含IField列表的列表

interface IField 
{ 
object Data{get;set;} 
} 

interface IField<T> : IField 
{ 
T TypedObject{get;set;} 
} 

現在您可以擁有一個添加了IField對象的列表。

編輯:我不喜歡使用基類,除非我真的必須因爲那然後刪除了以後使用繼承的可能性。繼承是一種簡單的解決方案,但帶有警告一大堆IMO