我没有找到我的问题的答案,但这似乎很简单。主要的大问题是我在 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”不是选项,因为实际代码要大得多。
有什么建议么?
在我看来,您试图覆盖 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]);
我知道这两者都有缺点和局限性,但由于我不知道您的实际目标,我发现很难说得更具体。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句