动态调用子类的重载方法

Dynamically call overload methods of subclass

我正在用 C# 编写一个游戏服务器,现在我遇到了一个问题,即调用适当的方法来正确地按类型处理每条消息。这个简单的代码说明了我当前的解决方案:

public class DynamicBase
{
    public int Method(Abc abc) => 2;
    public virtual void Run()
    {
        IAbc abc = new Abc();
        Console.WriteLine(Method((dynamic)abc)); // print 2
        IAbc aha = new Aha();
        // expecting print 3
        Console.WriteLine(Method((dynamic)aha)); //Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
    }
}
public class DynamicSub : DynamicBase
{
    public int Method(Aha a) => 3;
}
public class Abc : IAbc { }
public class Aha : IAbc { }
public interface IAbc { }
//In Main(): new DynamicSub().Run();

Method((dynamic)aha) 的异常是由于运行时仅检查 DynamicBase 及其基础 class 的 Method 重载。如果我想让它在 DynamicSub 中调用 Method,那么我需要用与基础 class.

中完全相同的代码覆盖 Run

那么,如何在不覆盖的情况下实现此行为?

如果不是,我如何通过以编程方式复制虚拟方法(我的意思是 IL 代码)来为子 class 动态发出 Run 的覆盖?这样我的用户(我的库)就不必自己将 Run 方法复制到子 class。

    Console.WriteLine(Method((dynamic)aha)); 

在编译时解析 Method,实际上只会是 DynamicBase.Method

你想要的是动态解析 Method 这意味着你调用方法的引用必须是 dynamic:

Console.WriteLine(((dynamic)this).Method((dynamic)aha));

请注意,对于您想要实现的目标,很可能有更多类型安全的解决方案。如果您正在努力规避 C# 的所有类型安全,您可能需要研究更多动态语言 - JavaScript 和 NodeJS 是一个不错的选择。