【发布时间】:2012-04-14 07:32:38
【问题描述】:
我们使用生成代码的实用程序。我想扩展它,并认为我可以在不回到代码生成器的情况下做到这一点。这就是问题所在。
代码生成器给我:
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 方法。 有什么办法可以让我不必在每个子类中都实现这个吗?
【问题讨论】:
-
您是否有理由不使用部分类向生成的基类添加额外的方法而不是扩展方法?
-
嗯,这是个好主意,但我认为它失败了,因为所有部分都必须使用 partial 关键字
标签: c#