C# 动态调用子类的重载方法

C# 动态调用子类的重载方法,c#,.net,dynamic,cil,C#,.net,Dynamic,Cil,我正在用C编写一个游戏服务器,现在我遇到了一个问题,就是调用适当的方法来正确处理每一条消息的类型。我当前的解决方案如以下简单代码所示: public class DynamicBase { public int Method(Abc abc) => 2; public virtual void Run() { IAbc abc = new Abc(); Console.WriteLine(Method((dynamic)abc));

我正在用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();
Methoddynamicaha的异常是由于仅在运行时检查DynamicBase及其基类的方法重载。如果我想让它调用DynamicSub中的方法,那么我需要用基类中完全相同的代码重写运行

那么,我如何在没有覆盖的情况下实现这种行为呢

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

    Console.WriteLine(Method((dynamic)aha)); 
这将在编译时解析方法,而编译时实际上只是DynamicBase.Method

您需要的是动态解析方法,这意味着您调用该方法的引用必须是动态的:


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

Console.WriteLineMethoddynamicaha;如果某个继承者DynamicSub2没有MethodAha?您正在尝试实现非常奇怪的行为。永远不要尝试在基类内调用派生类方法。“你想解决什么问题?”GuruStron抛出RuntimeBinderException。如果我想使异常静音,那么我将使用Methodobjecto@VladaxLe假设我有一个PeerBase类来处理来自客户端的请求。它将传入的请求反序列化到POCO。每个POCO将由一个适当的方法进行不同的处理,该方法在编译时或运行时充当子类和其他OOP语言解析方法的接口。虚拟方法在运行时解析,重载方法在编译时解析。我的例子是,我试图调用重载方法,它们在编译时被解析,所以我在运行时通过将其强制为动态来解析。还有更多类型安全的解决方案。我以前确实为参数中的每种对象类型维护了一个委托字典,但它比动态的慢得多。我还有一个MethodObject obj来处理我不知道的所有参数类型,因此避免处理RuntimeBinderException对性能的影响。
Console.WriteLine(((dynamic)this).Method((dynamic)aha));