0

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

我的情况是这样的:我有一个编译的 .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被删除,这会改变我不想做的原始功能。

那么我该如何克服呢?

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

4

2 回答 2

3

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

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

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

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

于 2018-12-21T14:23:57.963 回答
2

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

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

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

于 2018-12-21T14:48:25.850 回答