泛型和继承
本文关键字:继承 泛型 | 更新日期: 2023-09-27 17:50:20
两个问题在一起…
我有一组从基类(称为RecordBase)继承的DataRow包装器(在VS2008)。它们都有一个名为TableName的字段。我想做一个通用的枚举器,它是数据集的扩展方法。特定的TableName将选择要枚举数据集中的哪个表。我想写
public static IEnumerable<T> GetRecords<T>(this DataSet MySet) where T : RecordBase
{
foreach (DataRow row in MySet.Tables[T.TableName].Rows)
{
yield return new T(row);
}
}
问题1:我找不到一种方法来拥有一个可重写的静态字段,迫使我创建一个虚拟的包装器实例,只是为了获得TableName。
问题2:不那么严重,即使包装器(和基类)有一个接受DataRow的构造函数,编译器仍然坚持我使用无参数构造函数约束。
所有这些让我的代码看起来像public static IEnumerable<T> GetRecords<T>(this DataSet MySet) where T : RecordBase, new()
{
string TableName = (new T()).TableName;
foreach (DataRow row in MySet.Tables[TableName].Rows)
{
T record = new T();
record.RowData = row;
yield return record;
}
}
任何想法?
您可以使用表名和Activator
的自定义属性来实例化类型:
[Table("Customers")]
class Customer : RecordBase { }
//...
public static IEnumerable<T> GetRecords<T>(this DataSet MySet) where T : RecordBase
{
var attribT = typeof(TableAttribute);
var attrib = (TableAttribute) typeof(T).GetCustomAttributes(attribT,false)[0];
foreach (DataRow row in MySet.Tables[attrib.TableName].Rows)
{
yield return (T) Activator.CreateInstance(typeof(T),new[]{row});
}
}