我可以为在基类中调用受保护方法的派生类添加扩展方法吗?

Col*_*lin 1 c#

我们使用生成代码的实用程序.我想扩展它,并认为我可以在不返回代码生成器的情况下完成它.这是问题所在.

代码生成器给了我:

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

然后它会生成许多实现此类的类.例如

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想扩展所有子类,以便覆盖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);
}
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨,因为service参数不是子类的实例,因此无法访问受保护的CreateSelectCommand和Fill方法.有什么方法可以解决这个问题,这样我就不必在每个子类中实现这个了吗?

Ode*_*ded 6

有什么方法可以解决这个问题,这样我就不必在每个子类中实现这个了吗?

不,没有.

扩展方法是静态的方法静态的,只有出现(通过智能感知的魔力),以"属于"一类的类.这意味着类型需要完全匹配(对于一个).

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