【问题标题】:How to hide the private method of base class in C#?如何在C#中隐藏基类的私有方法?
【发布时间】:2019-05-08 18:58:26
【问题描述】:

我没有找到问题的答案,但这似乎很简单。主要的大问题是我在 dll 中购买了一些库和一些硬编码的功能,如果没有源代码,我无法重新编译该 dll。所以这里是学校层面的问题:

我们有 2 类 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”。 我们不能对类 A 做任何事情,但我们可以改变类 B。我们应该得到字符串“B”。

我尝试使用“new”修饰符,但是,如您所知,它没有帮助。答案“也只是覆盖 Method1”不是选项,因为实际代码要大得多。

有什么建议吗?

【问题讨论】:

  • 所以你不能改变A类也不能覆盖A.Method1?
  • 如果无法修改A 使其成为protected virtual void Method2()...,则无法覆盖它。 AB 一无所知,所以当您调用 A.Method1() 时,它总是会调用 its Method2,而不是派生类,因为它们截然不同。
  • 您不能覆盖私有方法。如果你使用A,你会得到它的私有方法的作用。我唯一可以建议的是使用像 Jetbrains DotPeek 这样的反编译器,它是免费的。它将反编译dll,甚至可以创建一个项目。源代码看起来有点滑稽,但你可以使用它来创建不同版本的类,或者只提取你想要保留的部分。
  • 问题不清楚,似乎无法解释真正的问题

标签: c# inheritance polymorphism encapsulation method-hiding


【解决方案1】:

在我看来,您正试图覆盖 Method2 以使 Method1 打印“B”。但是,由于 Method2 在 A 类中是私有且非虚拟的,因此按照 C# 语言的定义,这是不可能

如果我们可以妥协以找到不同的方法来实现您想要的结果,这里有一些建议。

类组合作为修改后的样板:

class B
{
    private A;
    public void Method1() {
        this.Method2 ();
    }
    private void Method2() {
        WriteLine("B");
    }
    public void KeptMethod() {
        a.KeptMethod();
    }
}

调用/修改私有成员的反射:

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]);

我知道这两者都有缺点和局限性,但由于我不知道您的实际目标,我发现很难更具体。

【讨论】:

  • 第一种方式类似于全方法实现。我在 A 类有下一个: private void Method() { m1(); m2(); m3(); m4(); m5(); ... } 但在我的情况下,这个“m”之一是不正确的。例如,我需要在 m3() 方法中做一些其他的事情。所以我想覆盖该功能。也许有任何方法可以使用反射重新链接方法调用,例如 typeof(A).GetMethod("Method 2").RebindTo(typeof(B).GetMethod("CustomMethod"))?
  • 我的第一反应是说这也是不可能的。但是,我发现其他人的工作可以满足您的需求:stackoverflow.com/questions/7299097/…
  • 看来你节省了我很多时间!十分感谢。我稍后会尝试并通知您(如果可行,我会标记为已解决)
  • 所以...它确实有效。我在 MSVS 项目中测试过,没关系。另外,我找到了一个很好的链接,它可以帮助我解决主要问题 github.com/jbevain/cecil 。但是当前的问题已经完成。谢谢@Rhaokiel!
猜你喜欢
  • 2012-06-07
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2012-01-17
  • 2021-01-17
  • 2010-11-10
  • 2013-02-18
  • 2011-09-14
相关资源
最近更新 更多