在运行时实例化时动态包装C#方法的内容

我有一个带有一些虚函数的基类


public class ABaseClass

{

    public virtual void DoAThing()

    {

        print("print this base");

    } 

}

我还有另一个从基类继承的类,如下所示。


public class AChildClass : ABaseClass

{

    public override void DoAThing()

    {

        print("child override");

        base.DoAThing();

    } 

}

在运行时,我想实例化子类,同时还要包装/注入/覆盖它在基类中重写的方法,如下所述。我基本上想添加到DoAThing方法,以便在其他地方调用它时,它将执行我添加的额外代码。


...

//somewhere else I instantiate and override the method at runtime

AChildClass instance = new AChildClass()

{

    DoAThing = new method()

    {

        // Do some extra stuff

        print("print this also");


        // do child class stuff and base stuff

        print("child override")

        base.DoAThing(); //print("print this base");

    }

}

这可以在C#中完成吗?


牧羊人nacy
浏览 120回答 2
2回答

汪汪一只猫

最接近伪代码的方法是将一个Action委托字段添加到基类中,如下所示:public class Program{    public static void Main()    {        Console.WriteLine("Hello World");        AChildClass instance = new AChildClass()        {            DoSomethingExtra = () => Console.WriteLine("print this also")        };        instance.DoAThing();    }}public class ABaseClass{    public Action DoSomethingExtra;    public virtual void DoAThing()    {        DoSomethingExtra();        Console.WriteLine("print this base");    }}public class AChildClass : ABaseClass{    public override void DoAThing()    {        Console.WriteLine("child override");        base.DoAThing();    }}输出:child overrideprint this alsoprint this base由于它是一个字段,因此您可以在实例化后随时更改委托指向的方法:instance.DoSomethingExtra = () => Console.WriteLine("new thing");

12345678_0001

除非您动态重新编译,否则您不能覆盖用C#编译后的方法。如评论中所述,一种可能的方法是使用委托。您可以将委托传递到可选的构造函数中DoAThing,并在传入的情况下调用它:public class AChildClass : ABaseClass{    private readonly Action _doAThing;    public AChildClass() { }    public AChildClass(Action doAThing)    {        _doAThing = doAThing;    }    public override void DoAThing()    {        if (_doAThing != null)        {            _doAThing();        }        print("child override");        base.DoAThing();    }}在您的情况下,该实例化为:AChildClass instance = new AChildClass(() => {    // Do some extra stuff    print("print this also");    // do child class stuff and base stuff    print("child override")});调用时将触发另外两个打印语句:instance.DoAThing();也打印此
打开App,查看更多内容
随时随地看视频慕课网APP