我们使用生成代码的实用程序.我想扩展它,并认为我可以在不返回代码生成器的情况下完成它.这是问题所在.
代码生成器给了我:
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方法.有什么方法可以解决这个问题,这样我就不必在每个子类中实现这个了吗?
有什么方法可以解决这个问题,这样我就不必在每个子类中实现这个了吗?
不,没有.
扩展方法是静态的方法静态的,只有出现(通过智能感知的魔力),以"属于"一类的类.这意味着类型需要完全匹配(对于一个).
它还意味着它们不属于该类型,并且无权访问该类型中声明的任何受保护/私有成员.