c#泛型列表的列表

本文关键字:列表 泛型 | 更新日期: 2023-09-27 18:09:44

嗨,我有一个sql应用程序的简单问题,我似乎无法解决。它涉及到我不太熟悉的泛型的使用。我在这里和网上做了研究,但我似乎没有找到适合我的情况的解决方案。

我有两个类:表和字段。我希望表包含字段列表,我希望每个字段包含RecordSet列表。棘手的部分是我希望用户选择要实现哪种类型的RecordSet。

Table的类定义为:
namespace DBlib
{
    public class DBTable<T>
    {
        public List<DBField<T>> FieldName = new List<DBField<T>>();
        public DBTable (string NameOfTable)
        {
        }
        public void AddField (string Name)
        {
            DBField<T> TempList = new DBField<T>();
            FieldName.Add(TempList);
        }
    }
}

Field的类定义为:

namespace DBlib
{
    public class DBField<T>
    {
        public List<T> RecordSet = new List<T>();
        public DBField()
        {            
        }         
    }
}

使用这段代码,用户在实例化DBTable时强制转换类型。这是不正确的。我希望用户在调用AddField方法时强制转换类型。你能建议一个简单的方法来解决这个问题吗?

UPDATE # 1我在表类定义中将TempList更改为DBField。很抱歉给您造成了混乱。

我还想添加这段代码来更好地解释我的问题是什么。假设表的第一个字段是整数,用户应该这样做:
namespace SpecifytheName
{
    public class User
    {
        DBTable<int> Table = new DBTable<int>(); 
        public User()
        {            
        }         
    }
}

相反,我希望用户做:

namespace SpecifytheName
{
    public class User
    {
        DBTable Table1 = new DBTable("Table1"); 
        // SPECIFY THE TYPE OF FIELD1 ONLY AT THIS POINT
        Table1.AddField<int>("Field1");  //or something like this
        public User()
        {            
        }         
    }
}

c#泛型列表的列表

我通常会使用非通用接口来存储您的字段来解决这个问题。

从这个界面开始:

public interface IDBField
{
    IList RecordSet { get; }
    Type FieldType { get; }
}

现在实现DBField<T>如下:

public class DBField<T> : IDBField
{
    public List<T> RecordSet = new List<T>();
    IList IDBField.RecordSet
    {
        get
        {
            return this.RecordSet;
        }
    }
    Type IDBField.FieldType
    {
        get
        {
            return typeof(T);
        }
    }      
}

那么你可以这样实现DBTable:

public class DBTable
{
    public List<IDBField> FieldName = new List<IDBField>();
    public void AddField<F>(string Name)
    {
        FieldName.Add(new DBField<F>());
    }
}

您可以在IDBField上使用FieldType属性来确定字段的类型,然后在必要时使用反射来适当地使用RecordSet的值。

我能看到这个工作的唯一方法是不使用泛型,而只是使用Object类。

例如:

public class DBTable
{
    public List<DBField<Object>> FieldName = new List<DBField<Object>>();
    public DBTable (string NameOfTable)
    {
    }
    public void AddField(string Name)
    {
        List<DBField<Object>> TempList = new List<DBField<Object>>();
        FieldName.Add(TempList);
    }
}

这意味着您可以在RecordSet对象中使用任何类型,而不限制DBTable类中的类型。

我在这里可能有点偏离基础,因为我不确定你想要实现什么,首先,你没有将Name参数传递给AddField方法,而且你的TempList对象与FieldName不是同一类型,所以它应该抛出一些错误。

编辑:

我想我更明白你想做什么,试试这个-

public class DBTable
{
    public List<DBField<Object>> FieldName = new List<DBField<Object>>();
    public DBTable (string NameOfTable)
    {
    }
    public void AddField<FieldType>(string Name)
    {
        DBField<FieldType> field = new DBField<FieldType>(Name);
        FieldName.Add(field);
    }
}

这样,每个字段(列)仍然被强制为一个类型,但是DBTable不被绑定到相同的类型。