gpt4 book ai didi

c# - 泛型和继承

转载 作者:行者123 更新时间:2023-11-30 18:05:19 25 4
gpt4 key购买 nike

两个问题合二为一...

我有一组从基类(称为 RecordBase)继承的 DataRow 包装器(在 VS2008 中)。它们都有一个名为 TableName 的字段。我想制作一个通用枚举器,它是 DataSet 的扩展方法。特定的 TableName 将选择要枚举 DataSet 中的哪个表。我想写

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});
}
}

关于c# - 泛型和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5697636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com