c# - 将对象传递给方法重载范围
问题描述
我正在尝试在我正在构建的服务器上简化发送功能。我想通过拥有它来减少发送数据的方法的数量,以便在参数中指定发送的信息。
例如,从很多这样的方法开始:
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# 中进行方法重载解析?.
请注意,反射非常缓慢。如果你打算走这条路,你可能至少想记住MethodInfo
你遇到的每种参数类型的对象,更有可能你想记住一个代表方法的实际委托实例(例如,Expression
用于构建代表)。
另一种方法是在代码中手动创建委托字典。这是实现目标的一种更简单的方法,但存在忽略受支持方法的风险。您需要确保您的字典包含您期望的每种参数类型的条目,如果稍后添加新类型,您必须记住将其添加到您的字典中。
综上所述,我建议不要这样做。我不知道你现在有多少方法,但事实是它们准确地反映了你的网络 API 的复杂性。只需查看已实现的方法,即可轻松查看代码并查看协议支持的所有内容。查看每个协议方法的参数是什么也很简单,也许最重要的是,C# 类型系统为您提供了每个调用站点正确性的编译时保证。
如果您切换到基于反射的方法,您将失去所有这些提高代码可维护性和可靠性的功能。每个调用者都应该只“知道”要传递的正确参数,并且编译器不会提供任何帮助来确保它们传递正确的参数。并且代码也将更难阅读。
如果您发现 API 中的方法数量超过了某个舒适阈值,您可能需要考虑是否需要重新设计 API 本身,或者通过添加新端点,或者通过构建 API 中的方法以包含某种有助于更好地组织它们的层次结构。我不相信改变 API 的实现是正确的道路。确实,我很确定不是。:)
推荐阅读
- php - 无法确定属性的访问类型
- bash - 执行批处理脚本时出现 Ubuntu grep 选项错误
- python - XOR 大于 4 的偶偶或奇偶对
- java - Hibernate OneToONE 延迟获取
- asp.net-mvc - 跨多个应用服务计划覆盖 Microsoft Azure 应用服务上的 MachineKey
- c# - dotnet core http请求集源ip
- java - Netbeans 未在 ubuntu 18 中打开
- javascript - 从 datatimepicker 时间选择器中的按钮添加小时和分钟
- c++ - 如何访问子类的新成员函数?
- angular - 为什么将服务注入独立的类反模式?