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()
{
}
}
}
我通常会使用非通用接口来存储您的字段来解决这个问题。
从这个界面开始:
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不被绑定到相同的类型。