C# 使用委托和MethodInfo获取方法名称,以便在Photon中的RPC调用中使用

C# 使用委托和MethodInfo获取方法名称,以便在Photon中的RPC调用中使用,c#,unity3d,introspection,photon,C#,Unity3d,Introspection,Photon,在光子中,可以使用PhotonView(“methodName”,photonTargets,parameters[])对PhotonView(用PunRPC装饰)进行RPC调用,或photonView(“方法名”,PhotonLayer,参数[]) 其中一个问题是,必须使用字符串引用方法,缺乏IDE支持。使用ReSharper之类的工具,我通常可以使用CTRL+B直接导航到方法定义;这不能仅在包含方法名称的字符串上完成。我自己的懒惰是不想手动搜索方法,当在同一个项目上工作的多个开发人员从不同的

在光子中,可以使用
PhotonView(“methodName”,photonTargets,parameters[])对PhotonView(用PunRPC装饰)进行RPC调用,或<代码>photonView(“方法名”,PhotonLayer,参数[])

其中一个问题是,必须使用字符串引用方法,缺乏IDE支持。使用ReSharper之类的工具,我通常可以使用CTRL+B直接导航到方法定义;这不能仅在包含方法名称的字符串上完成。我自己的懒惰是不想手动搜索方法,当在同一个项目上工作的多个开发人员从不同的类到处进行RPC调用时,这种混乱和频繁的搜索会严重消耗意志力

我考虑做的是为PhotonView创建扩展方法,使用委托而不是字符串进行RPC调用,并使用该委托获取方法名称

例如:

    public static void CallRPC(
        this PhotonView photonView, 
        Action method,
        PhotonTargets photonTargets,
        params object[] parameters)
    {
        photonView.RPC(method.Method.Name, photonTargets, parameters);
    }

    public static void CallRPC<T1>(
        this PhotonView photonView,
        Action<T1> method,
        PhotonTargets photonTargets,
        params object[] parameters)
    {
        photonView.RPC(method.Method.Name, photonTargets, parameters);  
    }
publicstaticvoidcallrpc(
这张照片,
行动方法,
光目标光目标,
参数对象[]参数)
{
RPC(method.method.Name、photonTargets、参数);
}
公共静态void CallRPC(
这张照片,
行动方法,
光目标光目标,
参数对象[]参数)
{
RPC(method.method.Name、photonTargets、参数);
}
等等,涵盖任何可预见数量的参数的方法的PunRPC调用(我使用Action,因为据我所知,没有任何RPC调用可以返回值,所以我们编写的任何PunRPC方法都应该返回void)

通过这种方式,我获得了更多的IDE支持,并且可以使用CTRL+B导航到委托的方法定义。此外,无需为所有RPC方法名称创建字符串常量


我的问题是,这将如何影响性能?我看到MethodInfo,并立即假设可能会发生一些反射。假设性能影响可以忽略不计,那么内存分配呢?我隐约记得在某个地方读到过这样一篇文章:根据您使用代理的方式,您可能需要缓存它们,或者每次使用都会冒额外分配的风险


这是可行的,开销很少吗?还是有更好的方法?

“我的问题是,这会对性能产生怎样的影响?”当然,这是你可以自己测试的。同样,内存分配也是如此。老实说,我希望这里的成本远小于RPC本身的成本。抱歉,你说得对,我应该自己分析一下。我在一个单独的项目中这样做了,据我所知,在随后的调用中没有为代理进行额外的分配(至少,如果我正确阅读了探查器的话),就是这样。我想,由于RPC调用的频率很低,额外的分配可能没有那么重要,至少在我自己的用例中是这样。谢谢你的快速回复!不过,如果其他人真的想到了更好的处理方法,我洗耳恭听。嗨,这确实是一个有趣的想法,我已经在内部提出了一个问题,我们将研究您的解决方案及其影响,以及它是否可以添加到光子api中。谢谢你的建议:)另外,你应该使用光子论坛,你可能会得到更多的反馈。很高兴听到:)它最终有点冗长(因为你必须在调用中包含所有类型参数),但它确实起到了作用,并且使在代码库中的导航速度大大加快。我对VS的profiler还是有点陌生,所以我希望我对没有额外分配的看法是正确的。在任何情况下,我都会在未来利用光子论坛来回答这些问题。