C# 在重写的公共方法中访问私有方法
我目前在从重写的公共方法访问私有方法时遇到一些问题 我的情况是这样的:我有一个编译的.dll文件,它基本上由以下内容组成C# 在重写的公共方法中访问私有方法,c#,inheritance,overriding,access-levels,C#,Inheritance,Overriding,Access Levels,我目前在从重写的公共方法访问私有方法时遇到一些问题 我的情况是这样的:我有一个编译的.dll文件,它基本上由以下内容组成 public class OriginalHandler { public virtual void Request() { RedirectIfConditionIsFulfilled() this.PeformRequest() } protected virtual bool PeformRe
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);
}
}
这就是我遇到的问题,我可以从SiteSpecificModifieryGinalHandler不调用受保护的方法PeformRequest
,但是可以调用公共方法
Request
,该方法在内部调用所需的函数,因此我创建了一个覆盖函数,
确保调用的不是原始版本,而是我的修改版本
public class ModifiedOriginalHandler : OriginalHandler
{
protected override bool PeformRequest()
{
}
public override void Request()
{
RedirectIfConditionIsFulfilled()
this.PeformRequest()
}
}
这就是我的问题所在,redirectifconditioniscompleted
是一个私有方法,
我不能这样调用这个方法。我可以在我的重写函数中删除此调用,但那会
需要删除redirectifconditioniscompleted
,这将改变原始功能,我不想这样做
那么我该如何克服这一点呢
如何在重写的公共方法中访问私有方法?如果可以访问
原始处理程序
实现,则将派生类设为嵌套类:
class A {
private void Foo() { }
protected virtual void Bar() { }
public class B: A {
protected override void Bar() {
Foo(); \\ legal } } }
如果不禁用反射,则无法从外部类型访问另一类型的私有成员。如果可以访问
原始处理程序
实现,则将派生类设为嵌套类:
class A {
private void Foo() { }
protected virtual void Bar() { }
public class B: A {
protected override void Bar() {
Foo(); \\ legal } } }
如果不禁用反射,则无法从外部类型访问另一类型的私有成员。您无法从继承的类访问
private
方法。(但你知道的。)
但是您的问题没有给出任何理由说明您的方法不应该受到保护
,这会将其暴露给继承的类
您所描述的正是protected
存在的原因
嵌套类可以工作,但我不推荐它,除非您希望每个需要
private
方法的继承类都嵌套在基类中。如果一些继承类有自己的private
方法,而更多继承类需要访问这些方法,该怎么办?您必须在嵌套的类中嵌套类。您不能从继承的类访问private
方法。(但你知道的。)
但是您的问题没有给出任何理由说明您的方法不应该受到保护
,这会将其暴露给继承的类
您所描述的正是protected
存在的原因
嵌套类可以工作,但我不推荐它,除非您希望每个需要
private
方法的继承类都嵌套在基类中。如果一些继承类有自己的private
方法,而更多继承类需要访问这些方法,该怎么办?您必须在嵌套的类中嵌套类。如果您希望能够从继承的类访问它,为什么不将其设置为受保护的而不是私有的?这就是它的目的。有很多代码需要通读。。。如果你能在不丢失任何关键信息的情况下压缩它,那将非常有帮助。此外,您可能想阅读:@DaveInCaz这应该是一个相当不错的MVCE,我试图解释我是如何以及为什么最终得到我的解决方案的。如果您的问题基本上是“如何在重写的公共方法中访问私有方法?”那么其余的基本上是上下文;上下文解释了为什么您需要这样做,但它是特定技术要求的附件。阅读越容易,你可能会得到更多/更好的答案。(也就是说,您得到了一些答案:))如果您希望能够从继承的类访问它,为什么不将其设置为受保护的而不是私有的?这就是它的目的。有很多代码需要通读。。。如果你能在不丢失任何关键信息的情况下压缩它,那将非常有帮助。此外,您可能想阅读:@DaveInCaz这应该是一个相当不错的MVCE,我试图解释我是如何以及为什么最终得到我的解决方案的。如果您的问题基本上是“如何在重写的公共方法中访问私有方法?”那么其余的基本上是上下文;上下文解释了为什么您需要这样做,但它是特定技术要求的附件。阅读越容易,你可能会得到更多/更好的答案。(也就是说,你得到了一些答案:))我刚刚结束了在我的ModifiedOriginalhandler
中重新实现相同的方法,不知道为什么它一开始是在Private实现的,它应该是一个受保护的方法。@Anita问谁实现了这个方法,他应该比任何人都清楚。假设设计是错误的可能是危险的,跳过基类期望调用的方法是导致灾难的好途径。除非你真的知道这个方法没有副作用,否则你无法以完全相同的方式复制它,你可能会搞乱这个类的不变量。我刚刚结束了在我的ModifiedOriginalhandler
中重新实现同一个方法的过程,我不知道为什么它一开始是在Private中实现的,“这应该是一个受保护的方法。”安妮塔问谁实现了这个方法,他应该比任何人都清楚。假设设计是错误的可能是危险的,跳过基类期望调用的方法是导致灾难的好途径。除非你真的知道这个方法没有副作用,你不能完全以同样的方式复制,否则你可能会把不变量搞砸