我们使用生成代码的实用程序。我想扩展它,并认为我可以在不返回代码生成器的情况下完成它。这是问题所在。
代码生成器给了我:
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方法。 有没有办法解决这个问题,以便我不必在每个子类中实现这个?
答案 0 :(得分:6)
有没有办法绕过这个,所以我不必在每个子类中实现这个?
不,没有。
扩展方法是静态类上的静态方法,它们只出现(通过intellisense的魔力)“属于”一个类型。这意味着类型需要与完全匹配(对于一个)。
这也意味着他们不属于该类型,并且无权访问该类型中声明的任何受保护/私有成员。
答案 1 :(得分:3)
没有。扩展方法纯粹是在其运行的类的外部。您可以访问受保护方法的唯一位置是类本身(或嵌套的内部类),或者是从其继承的另一个类。
顺便说一句,您没有使用扩展方法提供覆盖...
答案 2 :(得分:1)
没有。扩展方法是静态方法调用的语法糖。在可访问性方面,扩展方法的规则正是静态方法的规则。静态方法不能违反protected
之类的项目,因此也无法扩展方法