覆盖引用的程序集的类

时间:2011-05-22 21:02:08

标签: c# oop

我有程序集A,A有两个类a和b。

A.a在其中一些方法中使用A.b.

在我的集会中,B,我有两个班B.a和B.b。

B.a继承自A.a和B.b继承自A.b。

如何在没有访问源代码的情况下让A.a在使用A.b的方法中使用B.b而不是A.b?

4 个答案:

答案 0 :(得分:1)

没有A的源代码,并且A没有像使用IoC来解决A.b这样的任何事情,你做不到。 A.a和A.b之间的依赖关系在编译时设置,并且可能没有简单的方法来拦截它。

如果A.a中使用A.b的方法是虚拟的,那么您可以覆盖它们,并使用B.b重现它们的功能。

答案 1 :(得分:1)

没有A.a的支持?除了hackery反编译到IL(ildasm),更改然后重新编译(ilasm)之外什么都没有。如果程序集A具有强名称(签名)

,则无效

答案 2 :(得分:0)

A中的方法需要标记为virtual,以便您可以覆盖它们。

答案 3 :(得分:0)

嗯,这里有两个问题。

首先,您应该在A.a中创建您打算在A.b中使用的方法(因此在B.b中使用“替换”)虚拟。这可以确保您可以在B.b。

中覆盖它们

然而,A.a通过静态方法(无法覆盖)或通过A.b的实例访问A.b(您无法轻易替换它。)

如上所述,除了使方法虚拟之外,你还需要做的是在Aa中提供一个工厂方法,创建一个Ab的实例,然后你使用它的结果,然后在Ba你覆盖此方法。

让我演示这个LINQPad计划:

void Main()
{
    Ba instance = new Ba();
    instance.UseB();
}

public class Aa
{
    public void UseB()
    {
        Ab instance = CreateB();   // <-- call factory method instead of new
        instance.Test();
    }

    public virtual Ab CreateB()
    {
        return new Ab();
    }
}

public class Ab
{
    public virtual void Test()
    {
        Debug.WriteLine("A.b.Test");
    }
}

public class Ba : Aa
{
    public override Ab CreateB()   // <-- it still returns type "Ab"
    {
        return new Bb();           // <-- just create an instance of Bb instead
    }
}

public class Bb : Ab
{
    public override void Test()
    {
        Debug.WriteLine("B.b.Test");
    }
}