C# 在重写的公共方法中访问私有方法

C# 在重写的公共方法中访问私有方法,c#,inheritance,overriding,access-levels,C#,Inheritance,Overriding,Access Levels,我目前在从重写的公共方法访问私有方法时遇到一些问题 我的情况是这样的:我有一个编译的.dll文件,它基本上由以下内容组成 public class OriginalHandler { public virtual void Request() { RedirectIfConditionIsFulfilled() this.PeformRequest() } protected virtual bool PeformRe

我目前在从重写的公共方法访问私有方法时遇到一些问题

我的情况是这样的:我有一个编译的.dll文件,它基本上由以下内容组成

public class OriginalHandler
{
    public virtual void Request()
    {
        RedirectIfConditionIsFulfilled()
        this.PeformRequest()    
    } 


    protected virtual bool PeformRequest()
    {

    }

    private static void RedirectIfConditionIsFulfilled()
    {

    }

}
我需要更改方法
PeformRequest()
,因此我创建了一个公共类,该类继承
OriginalHandler
,并重写该方法:

public class ModifiedOriginalHandler : OriginalHandler 
{

    protected override bool PeformRequest()
    {

    }

}
为了确保这种方法不违反“影响”范围,我必须确保它只在某些站点上得到评估, 我们使用它来确保HttpRequestProcess只影响使用它的所需站点

namespace Sitecore.Sharedsource.Pipelines.HttpRequest
{
    using System.Collections.Generic;

    using Assert = Sitecore.Diagnostics.Assert;
    using S = Sitecore;

    public abstract class SiteSpecificHttpRequestProcessor: S.Pipelines.HttpRequest.HttpRequestProcessor
    {
            public abstract List<string> _sites;


            public sealed override void Process(S.Pipelines.HttpRequest.HttpRequestArgs args)
            {
                Assert.ArgumentNotNull(args, "args");

                if (S.Context.Site == null || !this._sites.FirstOrDefault(S.Context.Site.Name))
                {
                    return;
                }

                this.DoProcess(args, this._sites.FirstOrDefault(S.Context.Site.Name));
            }

        protected abstract void DoProcess(S.Pipelines.HttpRequest.HttpRequestArgs args, string);
    }
}
这就是我遇到的问题,我可以从SiteSpecificModifieryGinalHandler不调用受保护的方法
PeformRequest

但是可以调用公共方法
Request
,该方法在内部调用所需的函数,因此我创建了一个覆盖函数, 确保调用的不是原始版本,而是我的修改版本

public class ModifiedOriginalHandler : OriginalHandler 
{

    protected override bool PeformRequest()
    {

    }

    public override void Request()
    {
        RedirectIfConditionIsFulfilled()
        this.PeformRequest()    
    }        
}
这就是我的问题所在,
redirectifconditioniscompleted
是一个私有方法, 我不能这样调用这个方法。我可以在我的重写函数中删除此调用,但那会 需要删除
redirectifconditioniscompleted
,这将改变原始功能,我不想这样做

那么我该如何克服这一点呢


如何在重写的公共方法中访问私有方法?

如果可以访问
原始处理程序
实现,则将派生类设为嵌套类:

class A {
    private void Foo() { }
    protected virtual void Bar() { }

    public class B: A {
        protected override void Bar() {
            Foo(); \\ legal } } }

如果不禁用反射,则无法从外部类型访问另一类型的私有成员。

如果可以访问
原始处理程序
实现,则将派生类设为嵌套类:

class A {
    private void Foo() { }
    protected virtual void Bar() { }

    public class B: A {
        protected override void Bar() {
            Foo(); \\ legal } } }

如果不禁用反射,则无法从外部类型访问另一类型的私有成员。

您无法从继承的类访问
private
方法。(但你知道的。) 但是您的问题没有给出任何理由说明您的方法不应该受到
保护
,这会将其暴露给继承的类

您所描述的正是
protected
存在的原因


嵌套类可以工作,但我不推荐它,除非您希望每个需要
private
方法的继承类都嵌套在基类中。如果一些继承类有自己的
private
方法,而更多继承类需要访问这些方法,该怎么办?您必须在嵌套的类中嵌套类。

您不能从继承的类访问
private
方法。(但你知道的。) 但是您的问题没有给出任何理由说明您的方法不应该受到
保护
,这会将其暴露给继承的类

您所描述的正是
protected
存在的原因


嵌套类可以工作,但我不推荐它,除非您希望每个需要
private
方法的继承类都嵌套在基类中。如果一些继承类有自己的
private
方法,而更多继承类需要访问这些方法,该怎么办?您必须在嵌套的类中嵌套类。

如果您希望能够从继承的类访问它,为什么不将其设置为受保护的而不是私有的?这就是它的目的。有很多代码需要通读。。。如果你能在不丢失任何关键信息的情况下压缩它,那将非常有帮助。此外,您可能想阅读:@DaveInCaz这应该是一个相当不错的MVCE,我试图解释我是如何以及为什么最终得到我的解决方案的。如果您的问题基本上是“如何在重写的公共方法中访问私有方法?”那么其余的基本上是上下文;上下文解释了为什么您需要这样做,但它是特定技术要求的附件。阅读越容易,你可能会得到更多/更好的答案。(也就是说,您得到了一些答案:))如果您希望能够从继承的类访问它,为什么不将其设置为受保护的而不是私有的?这就是它的目的。有很多代码需要通读。。。如果你能在不丢失任何关键信息的情况下压缩它,那将非常有帮助。此外,您可能想阅读:@DaveInCaz这应该是一个相当不错的MVCE,我试图解释我是如何以及为什么最终得到我的解决方案的。如果您的问题基本上是“如何在重写的公共方法中访问私有方法?”那么其余的基本上是上下文;上下文解释了为什么您需要这样做,但它是特定技术要求的附件。阅读越容易,你可能会得到更多/更好的答案。(也就是说,你得到了一些答案:))我刚刚结束了在我的
ModifiedOriginalhandler
中重新实现相同的方法,不知道为什么它一开始是在Private实现的,它应该是一个受保护的方法。@Anita问谁实现了这个方法,他应该比任何人都清楚。假设设计是错误的可能是危险的,跳过基类期望调用的方法是导致灾难的好途径。除非你真的知道这个方法没有副作用,否则你无法以完全相同的方式复制它,你可能会搞乱这个类的不变量。我刚刚结束了在我的
ModifiedOriginalhandler
中重新实现同一个方法的过程,我不知道为什么它一开始是在Private中实现的,“这应该是一个受保护的方法。”安妮塔问谁实现了这个方法,他应该比任何人都清楚。假设设计是错误的可能是危险的,跳过基类期望调用的方法是导致灾难的好途径。除非你真的知道这个方法没有副作用,你不能完全以同样的方式复制,否则你可能会把不变量搞砸