首页 > 解决方案 > 将对象传递给方法重载范围

问题描述

我正在尝试在我正在构建的服务器上简化发送功能。我想通过拥有它来减少发送数据的方法的数量,以便在参数中指定发送的信息。

例如,从很多这样的方法开始:

    public static void QueryUsername( string text )
    {
        PacketBuffer buffer = new PacketBuffer();

        buffer.Write( Outbound.DoesUserExist );
        buffer.Write( text );
        ClientTCP.SendData( buffer.ToArray() );
        buffer.Dispose();
    }

对于这样的单一方法:

    public static void Send( Outbound packageIndex, params object[] parameter )
    {
        PacketBuffer buffer = new PacketBuffer();
        buffer.Write( packageIndex );

        foreach ( object item in parameter )
        {
            buffer.Write( item );
        }

        ClientTCP.SendData( buffer.ToArray() );
        buffer.Dispose();
    }

我很难弄清楚如何parameter通过该方法传递数据Write

有人对我如何实现这一目标有任何建议吗?

Write方法有 5 个重载,将不同的类型转换为字节,以便它们可以在客户端和服务器之间打包和发送。

标签: c#

解决方案


要完全按照您的要求进行操作,您需要根据所提供参数的类型使用反射来查找适当的方法。参见例如我如何以编程方式在 C# 中进行方法重载解析?.

请注意,反射非常缓慢。如果你打算走这条路,你可能至少想记住MethodInfo你遇到的每种参数类型的对象,更有可能你想记住一个代表方法的实际委托实例(例如,Expression用于构建代表)。

另一种方法是在代码中手动创建委托字典。这是实现目标的一种更简单的方法,但存在忽略受支持方法的风险。您需要确保您的字典包含您期望的每种参数类型的条目,如果稍后添加新类型,您必须记住将其添加到您的字典中。

综上所述,我建议不要这样做。我不知道你现在有多少方法,但事实是它们准确地反映了你的网络 API 的复杂性。只需查看已实现的方法,即可轻松查看代码并查看协议支持的所有内容。查看每个协议方法的参数是什么也很简单,也许最重要的是,C# 类型系统为您提供了每个调用站点正确性的编译时保证。

如果您切换到基于反射的方法,您将失去所有这些提高代码可维护性和可靠性的功能。每个调用者都应该只“知道”要传递的正确参数,并且编译器不会提供任何帮助来确保它们传递正确的参数。并且代码也将更难阅读。

如果您发现 API 中的方法数量超过了某个舒适阈值,您可能需要考虑是否需要重新设计 API 本身,或者通过添加新端点,或者通过构建 API 中的方法以包含某种有助于更好地组织它们的层次结构。我不相信改变 API 的实现是正确的道路。确实,我很确定不是。:)


推荐阅读