【问题标题】:Passing an object to range of method overloads将对象传递给方法重载范围
【发布时间】:2020-05-17 16:40:49
【问题描述】:

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

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

    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#


    【解决方案1】:

    要完全按照您的要求进行操作,您需要根据所提供参数的类型使用反射来查找适当的方法。参见例如How can I programmatically do method overload resolution in C#?.

    请注意,反射非常缓慢。如果您打算采用这条路线,您可能至少要记住您遇到的每种参数类型的 MethodInfo 对象,并且更有可能您想要记住表示该方法的实际委托实例(例如使用Expression 构建委托)。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2023-03-09
      • 2011-09-27
      • 2014-12-01
      相关资源
      最近更新 更多