【发布时间】:2018-12-21 14:18:17
【问题描述】:
我目前在从覆盖的公共方法访问私有方法时遇到一些问题。
我的情况是这样的:我有一个编译的 .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,这会改变原来的功能,我不想这样做。
那么我该如何克服呢?
如何在被覆盖的公共方法中访问私有方法?
【问题讨论】:
-
如果您希望能够从继承的类中访问它,为什么不使用
protected而不是private?这就是它的用途。 -
有很多代码需要通读...如果您可以压缩它而不丢失任何非常有用的关键信息。另外,您可能想阅读:stackoverflow.com/help/mcve
-
@DaveInCaz 这应该是一个漂亮的 MVCE,我试图解释我是如何以及为什么最终得到我的解决方案的......
-
如果您的问题基本上是“我如何在被覆盖的公共方法中访问私有方法?”那么剩下的基本上就是上下文了;上下文解释了您为什么需要它,但它是特定技术要求的附属品。它越容易阅读,您可能会收到更多/更好的答案。 (也就是说,你得到了一些答案:))
标签: c# inheritance overriding access-levels