[英]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.