动态调用子类的重载方法
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 是一个不错的选择。
我正在用 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 是一个不错的选择。