繁体   English   中英

将 object 传递给方法重载范围

[英]Passing an object to range of method overloads

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

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

    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();
    }

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

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

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

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

请注意,反射非常慢。 如果你打算走这条路,你可能希望至少为你遇到的每个参数类型记住MethodInfo object,更有可能你会想要记住代表该方法的实际委托实例(例如使用Expression来建立委托)。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM