我目前在从重写的公共方法访问私有方法时遇到一些问题。
我的情况是这样的:我有一个已编译的.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
,这将更改原始功能,而我不想这样做。
那我该如何克服呢?
如何在重写的公共方法中访问私有方法?
答案 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
方法,而更多继承的类需要访问这些方法,该怎么办?您必须将类嵌套在嵌套类中。