-2

我没有找到我的问题的答案,但这似乎很简单。主要的大问题是我在 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”。

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

有什么建议么?

4

1 回答 1

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

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

于 2019-05-08T19:22:37.033 回答