1

我在使用抽象泛型方法时遇到问题。

抽象方法定义

protected abstract T InitEntity<T>(ref NpgsqlDataReader reader) where T : BaseEntity, new();

执行

protected override EUser InitEntity<EUser>(ref NpgsqlDataReader reader) {

我在覆盖函数中遇到了 EUser 类的问题。该函数似乎将 EUser 视为 Generic T 仍然只有 BaseEntity 函数可用。ERole 是另一个实现 BaseEntity 的类,我能够在函数中使用该实体的全部功能。如果我想使用 EUser,每次我想使用不在它的父 BaseEntity 中的函数时,我都必须将它类型转换为 EUser。我的目标是将数据读取器传递给子类并让它填写必要的信息,但这很麻烦。我不想花费大量开销类型来转换子类中的所有内容。

这与泛型类不同。如果我实现一个子泛型类,我可以将 EUser 指定给父类,并且仍然具有该实体的全部功能。

有没有其他人对此有疑问,或者我是否错误地实现了抽象泛型函数?

父函数是这样开始的:

protected T Select<T>(string sql, params NpgsqlParameter []) {

然后父类像这样调用函数:

T entity = InitEntity<T>(ref dr);

问题必须是 T 用于生成子类方法,因此即使子类方法只会接受和使用 EUser。它仍然将其视为方法中的 Generic T。你们有什么建议吗?

这都是因为我有一个 Parent 类,它有几个我不想与任何子类共享的私有字段。通用方法 InitEntity 使用其中一些私有字段。因此,我正在使用通用方法。我可能只需要重新考虑我的实现并解决子泛型类。

编辑:

看起来在 C# 中的通用方法中,变量类型是在调用函数时定义的。如果没有主要的类型转换,您似乎无法在函数级别进一步定义该类型。如果您尝试像我一样在子类函数中实现类型,一切都会编译并运行,但是您在子类中的类型仍将被视为传入的类型。对于上面定义的问题,我只需要将泛型更改为类级别,而不仅仅是功能。做一个抽象的泛型函数。子函数需要保留传入的泛型 T,然后在函数体中进行类型转换。

4

0 回答 0