在覆盖的公共方法中访问私有方法

时间:2018-12-21 14:18:18

标签: c# inheritance override access-levels

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

我的情况是这样的:我有一个已编译的.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);
    }
}

所以请包括我的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
但可以调用内部调用所需函数的公共方法Request,因此我制作了覆盖函数, 确保不会调用原始版本,而是我的修改版本

public class ModifiedOriginalHandler : OriginalHandler 
{

    protected override bool PeformRequest()
    {

    }

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

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

那我该如何克服呢?

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

您不能从继承的类中访问private方法。 (但是你知道的。) 但是您的问题没有给出为什么您的方法不应为protected的任何原因,这会使它暴露给继承的类。

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

嵌套类将起作用,但是除非您希望将需要private方法的每个继承类都嵌套在基类中,否则我不建议这样做。如果其中一些继承的类具有自己的private方法,而更多继承的类需要访问这些方法,该怎么办?您必须将类嵌套在嵌套类中。