【问题标题】:Can I add an extension method to derived classes that calls protected methods in the base?我可以向派生类添加扩展方法来调用基类中的受保护方法吗?
【发布时间】: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#


【解决方案1】:

有什么办法可以让我不必在每个子类中都实现这个吗?

不,没有。

扩展方法是 static 类上的 static 方法,仅显示(通过智能感知的魔力)“属于”一个类型。这意味着类型需要完全匹配(对于一个)。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      没有。扩展方法是静态方法调用的语法糖。在可访问性方面,扩展方法的规则与静态方法完全相同。静态方法不能违反 protected 这样的项目,因此扩展方法也不能

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-30
        • 2011-04-07
        • 2010-11-16
        • 2011-06-08
        • 2017-05-05
        • 1970-01-01
        • 2017-12-14
        • 2023-04-09
        相关资源
        最近更新 更多