繁体   English   中英

是否可以在派生类中添加扩展方法,以在基类中调用受保护的方法?

[英]Can I add an extension method to derived classes that calls protected methods in the base?

我们使用一个生成代码的实用程序。 我想扩展它,并认为我可以不用返回代码生成器就可以做到。 这是问题所在。

代码生成器给我:

public abstract class BaseService
{
    protected virtual SqlCommand CreateSelectCommand(string whereClause, Hashtable parameters, string orderClause, int maxRows);
    protected DataSet Fill(SqlCommand command);
}

然后,它将生成许多实现该类的类。 例如

public class ChildService : BaseService
{
    protected override SqlCommand CreateSelectCommand(string whereClause, Hashtable parameters, string orderClause, int maxRows)
    {
        //implementation here
    }

    protected override SqlCommand CreateSelectCommand(string whereClause, Hashtable parameters, string orderClause, int maxRows)
    {
        //implementation here
    }

    public virtual DataSet Select(string whereClause, System.Collections.Hashtable parameters, string orderClause, int maxRows)
    {
        SqlCommand command = CreateSelectCommand(whereClause, parameters, orderClause, maxRows);
        return Fill(command);
    }
}

现在,我想扩展所有子类,以使我可以重写Select方法。 我尝试了类似这样的扩展方法:

public DataSet Select(this BaseService service, string whereClause, Hashtable parameters, string orderBy, int startRowIndex, int maximumRows)
{
        SqlCommand command = service.CreateSelectCommand(whereClause, parameters, orderClause, maxRows);
        //Modify the command here
        return service.Fill(command);
}

但是编译器会抱怨,因为服务参数不是子类的实例,因此无法访问受保护的CreateSelectCommand和Fill方法。 有没有解决的办法,这样我就不必在每个子类中都实现它?

有没有解决的办法,这样我就不必在每个子类中都实现它?

不,没有。

扩展方法是静态类上的静态方法,这些静态类仅(通过智能感知)显示为“属于”某种类型。 这意味着类型需要完全匹配(一个)。

这也意味着它们属于该类型,并且无权访问该类型中声明的任何受保护/私有成员。

不能。扩展方法完全在其所运行的类的外部。 您只能在类本身(或嵌套的内部类)中,或从其继承的另一个类中访问受保护的方法。

顺便说一句,您根本没有使用扩展方法来提供替代...

不。扩展方法是用于静态方法调用的语法糖。 在可访问性方面,扩展方法的规则恰好是静态方法的规则。 静态方法不能违反诸如protected项,因此扩展方法也不能

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM