具有可变参数计数的操作

时间:2014-05-29 19:50:46

标签: c# unity3d

我正在使用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);
}

这可能吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

具有可变参数计数的操作

有可能:

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

您的问题

但它不是你要求的。实际上,您要求任何方法可分配的魔术委托类型。据我所知,这是不可能的。

这很奇怪(或者,也许,我不明白某些事情)。据我所知,你有很多像这样的方法

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
}

我有点喜欢它。它增加了方法参数的编译时间检查。这很好。我不明白的是:

  

有很多这些方法

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

  1. 创建一个单独的类,它将封装NetworkViewCall<>方法。
  2. RPCMode作为参数添加到Call<>方法。
  3. 如果您仍想这样做,请按照以下步骤操作:

        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
        }