gpt4 book ai didi

c# - 具有可变参数计数的操作

转载 作者:行者123 更新时间:2023-11-30 16:59:14 24 4
gpt4 key购买 nike

我正在使用 Unity 网络,并且正在编写一种通过网络调用另一个方法的方法。目前我有一堆方法看起来像

void Call<A>(Action<A> method, A arg) {
_networkView.RPC(method.Method.Name, RPCMode.Others, arg);
}

void Call<A,B>(Action<A,B> method, A arg1, B arg2) {
_networkView.RPC(method.Method.Name, RPCMode.Others, arg1, arg2);
}

...等等

还有在特定播放器上调用它的变体和使其与 Photon Cloud 一起工作的系统。所以有很多这样的方法,而且变得非常困惑。

现在,我想知道是否可以有一个可以包含任意数量参数的 Action。所以我可以做类似的东西:

void Call(Action method, params object[] args) {
_networkView.RPC(method.Method.Name, RPCMode.Others, args);
}

这可能吗?

谢谢!

最佳答案

具有可变参数计数的操作

有可能:

public delegate void ParamArrayAction<V>(params V[] variableArgs);
public delegate void ParamArrayAction<F, V>(F fixedArg, params V[] variableArgs);
public delegate void ParamArrayAction<F1, F2, V>(F1 fixedArg1, F2 fixedArg2, params V[] variableArgs);
public delegate void ParamArrayAction<F1, F2, F3, V>(F1 fixedArg1, F2 fixedArg2, F3 fixedArg3, params V[] variableArgs);

你的问题

但这不是你所要求的。实际上,您要求的是某种可以分配任何方法的魔法委托(delegate)类型。据我所知这是不可能的。

这很奇怪(或者,也许,我不明白什么)。据我了解,你有一大堆这样的方法

void Call<A>(Action<A> method, A arg) {
_networkView.RPC(method.Method.Name, RPCMode.Others, arg);
}

void Call<A, B>(Action<A, B> method, A arg1, B arg2) {
_networkView.RPC(method.Method.Name, RPCMode.Others, arg1, arg2);
}

.....

void Call<A, B, C, D>(Action<A, B, C, D> method, A arg1, B arg2, C arg3, D arg4) {
_networkView.RPC(method.Method.Name, RPCMode.Others, arg1, arg2, arg3, arg4);
}

.....

然后你像这样使用它们:

[RPC]
void DoSomething(string someText, int someValue)
{
// Bla-bla-bla
}

.....

void SomeRPCCallingMethod()
{
// Bla-bla-bla
Call(DoSomething, "Hello, World!", 42);
// Bla-bla-bla
}

我有点喜欢它。它为方法参数添加了编译时检查。哪个好。我不明白的是:

there are a whole lot of these methods

为什么?我不熟悉 Unity 的 RPC。但无论如何,您可以:

  1. 创建一个单独的类来封装NetworkViewCall<>方法。
  2. 添加RPCMode作为 Call<> 的参数方法。

如果你还想这样做,就这样做:

    void Call(string methodName, params object[] args) {
_networkView.RPC(methodName, RPCMode.Others, args);
}

Usage:

[RPC]
void DoSomething(string someText, int someValue)
{
// Bla-bla-bla
}

.....

void SomeRPCCallingMethod()
{
// Bla-bla-bla
Call("DoSomething", "Hello, World!", 42);
// Bla-bla-bla
}

关于c# - 具有可变参数计数的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23941770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com