在覆盖的 public 方法中访问私有方法

Accessing a private method in a overridden public method

我目前在从覆盖的 public 方法访问私有方法时遇到一些问题。

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

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


    protected virtual bool PeformRequest()
    {

    }

    private static void RedirectIfConditionIsFulfilled()
    {

    }

}

我需要改变方法 PeformRequest(),所以我做了一个 public class,它继承了 OriginalHandler 并重写了这样的方法:

public class ModifiedOriginalHandler : OriginalHandler 
{

    protected override bool PeformRequest()
    {

    }

}

为确保此方法不违反 "impact" 范围,我必须确保它仅在某些网站上进行评估, 我们使用它来确保 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);
    }
}

所以包括我的 ModifiedOriginalHandler 来包括这个

 public class SiteSpecificModifiedOriginalHandler: SiteSpecificHttpRequestProcessor
 {
Public override List<String> _sites => new[]
{
    "www.only.com"  , "www.boat.com"
};


public virtual HttpContext GetHttpContext()
    {
        return HttpContext.Current;
    }

    public override void DoProcess(HttpRequestArgs args, string)
    {
        var mediaRequest = new ModifiedOriginalHandler ();
        var context = GetHttpContext();
    var site = Sitecore.Context.Site;

        if (site == null)
        {
            return;
        }

        if (string != null)
        {
            mediaRequest.Request(context);
        }
        else
        {
            OriginalHandler baseClass = mediaRequest;
            baseClass.Request(context);
        }
    }
 }

这是我遇到问题的地方,我可以从 SiteSpecificModifiedOriginalHandler 不调用受保护的方法 PeformRequest,
但可以调用内部调用所需函数的 public 方法 Request,因此我创建了一个覆盖函数, 确保调用的不是原始版本而是我修改后的版本

public class ModifiedOriginalHandler : OriginalHandler 
{

    protected override bool PeformRequest()
    {

    }

    public override void Request()
    {
        RedirectIfConditionIsFulfilled()
        this.PeformRequest()    
    }        
}

这是我遇到问题的地方,RedirectIfConditionIsFulfilled 是私有方法, 而且我绝不能这样调用此方法。我可以在我重写的函数中删除这个调用,但那样会 要求删除 RedirectIfConditionIsFulfilled,这会改变我不想做的原始功能。

那么我该如何克服呢?

如何在覆盖的 public 方法中访问私有方法?

如果您有权访问 OriginalHandler 实现,则将派生 class 设为嵌套:

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

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

如果不这样做,则除非反射,否则无法从外部类型访问另一种类型的私有成员。

您无法从继承的 class 访问 private 方法。 (但你知道的。) 但是你的问题没有给出为什么你的方法不应该是 protected 的任何理由,这会将它暴露给继承的 classes。

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

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