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

时间:2012-03-30 15:25:26

标签: c#

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

代码生成器给了我:

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

然后它会生成许多实现此类的类。 e.g。

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);
}

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

3 个答案:

答案 0 :(得分:6)

  

有没有办法绕过这个,所以我不必在每个子类中实现这个?

不,没有。

扩展方法是静态类上的静态方法,它们只出现(通过intellisense的魔力)“属于”一个类型。这意味着类型需要与完全匹配(对于一个)。

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

答案 1 :(得分:3)

没有。扩展方法纯粹是在其运行的类的外部。您可以访问受保护方法的唯一位置是类本身(或嵌套的内部类),或者是从其继承的另一个类。

顺便说一句,您没有使用扩展方法提供覆盖...

答案 2 :(得分:1)

没有。扩展方法是静态方法调用的语法糖。在可访问性方面,扩展方法的规则正是静态方法的规则。静态方法不能违反protected之类的项目,因此也无法扩展方法