You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中无法重写DbParameter的virtual属性?求助排查

错误原因分析

  1. 初始代码的CS0115错误:
    DbParameter类并未将Precision和Scale作为public virtual属性暴露,而是通过显式实现IDbDataParameter接口定义这两个成员。显式实现的接口成员默认是私有访问级别,无法直接用override重写,因此编译器找不到可重写的目标。

  2. 修改后代码的错误:

    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:54:54