Доступ к приватному методу в переопределенном публичном методе - PullRequest
0 голосов
/ 21 декабря 2018

В настоящее время у меня возникают проблемы с доступом к закрытому методу из переопределенного публичного метода.

Моя ситуация такова: у меня есть скомпилированный файл .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 голосов
/ 21 декабря 2018

Вы не можете получить доступ к методу private из унаследованного класса.(Но вы это знаете.) Но ваш вопрос не дал никакой причины, по которой ваш метод не должен быть protected, что могло бы открыть его для унаследованных классов.

То, что вы описываете, это именно то, почему protected существует.

Вложенный класс будет работать, но я не рекомендую его, если вы не хотите, чтобы каждый унаследованный класс нуждался в private метод, который будет вложен в базовый класс.Что если некоторые из этих унаследованных классов имеют свои собственные private методы, и даже более унаследованные классы должны иметь к ним доступ?Вы должны будете вкладывать классы в свои вложенные классы.

0 голосов
/ 21 декабря 2018

Если у вас есть доступ к реализации OriginalHandler, то сделайте производный класс вложенным:

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

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

Если нет, тогда, за исключением отражения, нет способа получить доступ из внешнего типа к частномучлен другого типа.

...