如何在C#中隐藏baseclass的私有方法?
How to hide the private method of base class in C#?
我没有找到问题的答案,但看起来很简单。主要的大问题是我买了一些库和一些在 dll 中硬编码的功能,我无法在没有源代码的情况下重新编译该 dll。所以这里是学校层面的问题:
我们有 2 classes A 和 B
class A {
public void Method1() {
this.Method2 ();
}
private void Method2() {
WriteLine ("A");
}
}
class B : A {
private void Method2() {
WriteLine ("B");
}
}
如果我们调用 'new B().Method1()',那么我们有字符串行 "A"。
我们不能对 class A 做任何事情,但是我们可以改变 class B。我们应该得到字符串 "B".
我试过使用 'new' 修饰符,但如您所知,它没有帮助。答案 "Just override Method1 also" 不是选项,因为实际代码要大得多。
有什么建议吗?
在我看来,您正试图覆盖 Method2 以使 Method1 打印 "B"。但是,由于 Method2 是私有的并且 non-virtual 在 class A 中,这是 不可能的,正如 C# 语言所定义的那样。
如果我们可以妥协以找到不同的方法来实现您想要的结果,这里有一些建议。
Class 作为修改样板的组成:
class B
{
private A;
public void Method1() {
this.Method2 ();
}
private void Method2() {
WriteLine("B");
}
public void KeptMethod() {
a.KeptMethod();
}
}
对call/modify私人会员的反思:
typeof(A).GetField("privateValue", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(a, "injected string");
typeof(A).GetMethod("privateMethod", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(a, new object[0]);
我知道这两者都有缺点和局限性,但由于我不知道您的实际目标,所以我发现很难说得更具体。
我没有找到问题的答案,但看起来很简单。主要的大问题是我买了一些库和一些在 dll 中硬编码的功能,我无法在没有源代码的情况下重新编译该 dll。所以这里是学校层面的问题:
我们有 2 classes A 和 B
class A {
public void Method1() {
this.Method2 ();
}
private void Method2() {
WriteLine ("A");
}
}
class B : A {
private void Method2() {
WriteLine ("B");
}
}
如果我们调用 'new B().Method1()',那么我们有字符串行 "A"。 我们不能对 class A 做任何事情,但是我们可以改变 class B。我们应该得到字符串 "B".
我试过使用 'new' 修饰符,但如您所知,它没有帮助。答案 "Just override Method1 also" 不是选项,因为实际代码要大得多。
有什么建议吗?
在我看来,您正试图覆盖 Method2 以使 Method1 打印 "B"。但是,由于 Method2 是私有的并且 non-virtual 在 class A 中,这是 不可能的,正如 C# 语言所定义的那样。
如果我们可以妥协以找到不同的方法来实现您想要的结果,这里有一些建议。
Class 作为修改样板的组成:
class B
{
private A;
public void Method1() {
this.Method2 ();
}
private void Method2() {
WriteLine("B");
}
public void KeptMethod() {
a.KeptMethod();
}
}
对call/modify私人会员的反思:
typeof(A).GetField("privateValue", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(a, "injected string");
typeof(A).GetMethod("privateMethod", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(a, new object[0]);
我知道这两者都有缺点和局限性,但由于我不知道您的实际目标,所以我发现很难说得更具体。