C#中无法重写DbParameter的virtual属性?求助排查
错误原因分析
初始代码的
CS0115错误:DbParameter类并未将Precision和Scale作为public virtual属性暴露,而是通过显式实现IDbDataParameter接口定义这两个成员。显式实现的接口成员默认是私有访问级别,无法直接用override重写,因此编译器找不到可重写的目标。修改后代码的错误:
public和override修饰符不能用于显式接口实现:显式实现的接口成员默认私有,不需要也不允许加public;同时显式接口成员不属于基类可重写范畴,不能用override。- 接口实现语法错误:即使
DbParameter继承了IDbDataParameter,子类重新实现接口成员时,也不能混合基类限定符和修饰符,需遵循显式接口实现的语法规范。
解决方案
核心思路是通过显式实现IDbDataParameter接口接管Precision/Scale逻辑,转发到抽象方法;子类再通过new关键字隐藏这些成员,提供兼容旧版本的short类型属性:
修正后的SAbstractParameter代码
using System; using System.Data; using System.Data.Common; namespace Simba.ADO.Net { public abstract class SAbstractParameter : DbParameter, IDbDataParameter { // 显式实现IDbDataParameter.Precision,转发到抽象方法 byte IDbDataParameter.Precision { get => (byte)GetPrecision(); set => SetPrecision(value); } // 显式实现IDbDataParameter.Scale,转发到抽象方法 byte IDbDataParameter.Scale { get => (byte)GetScale(); set => SetScale(value); } // 定义抽象方法,让子类实现具体逻辑 protected abstract void SetPrecision(short precision); protected abstract short GetPrecision(); protected abstract void SetScale(short scale); protected abstract short GetScale(); // 必须实现DbParameter的所有抽象成员,示例实现如下 public override DbType DbType { get; set; } public override ParameterDirection Direction { get; set; } public override bool IsNullable { get; set; } public override string ParameterName { get; set; } public override string SourceColumn { get; set; } public override DataRowVersion SourceVersion { get; set; } public override object Value { get; set; } public override void ResetDbType() { } } }
子类SParameter实现(兼容旧版本)
namespace Simba.ADO.Net { public class SParameter : SAbstractParameter { // 用new关键字隐藏接口属性,提供short类型的兼容版本 public new short Precision { get => GetPrecision(); set => SetPrecision(value); } public new short Scale { get => GetScale(); set => SetScale(value); } // 实现基类的抽象方法,编写具体业务逻辑 protected override void SetPrecision(short precision) { // 自定义实现逻辑,比如存储precision值 } protected override short GetPrecision() { // 自定义实现逻辑,返回存储的precision值 return 0; } protected override void SetScale(short scale) { // 自定义实现逻辑 } protected override short GetScale() { // 自定义实现逻辑 return 0; } // 实现DbParameter的其他抽象成员(示例) public override DbType DbType { get; set; } public override ParameterDirection Direction { get; set; } public override bool IsNullable { get; set; } public override string ParameterName { get; set; } public override string SourceColumn { get; set; } public override DataRowVersion SourceVersion { get; set; } public override object Value { get; set; } public override void ResetDbType() { } } }
内容的提问来源于stack exchange,提问作者Bwmat
相关产品推荐
相关产品推荐

