2011-07-04 48 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