2014-12-02 53 views
0

我有一个基于网络状态调用委托的方法。该方法必须决定在哪里调用方法(服务器,客户端)。为了这个与任何方法的工作,我已经定义了以下代表:可以用params来调用强类型参数的方法吗?

public delegate void NetworkCall(params object[] args); 

这会采取任何参数,但只会用完全相同的签名方法的工作。这导致这个东西:

protected virtual void DoNetowrkMove(params object[] args) 
{ 
    destination = (Vector3)args[0]; 
} 

这不是一个理想的解决方案。将“args”中的对象“拆包”为更安全的方法调用是否可能?例如:

protected virtual void DoNetowrkMove(Vector3 newDestination) 
{ 
    destination = newDestination; 
} 
+0

是的,如果你改变你的委托声明。 – MarcinJuraszek 2014-12-02 05:18:14

+0

@MarcinJuraszek这将与任何方法? – Ben 2014-12-02 05:21:13

+0

任何采用相同参数集并返回相同类型的方法。我真的不明白为什么你需要一个能够匹配一切的代表。你确定你在这里没有面临XY问题吗? – MarcinJuraszek 2014-12-02 05:21:42

回答

1

我不确定在这里完全掌握了用例。似乎更灵活的解决方案将涉及到一些真正的数据发送序列化/反序列化,这将允许端到端的类型安全通信。

这是说,各位代表不要让你想直接做什么,你可以创建一个通用的方法来自动大部分的工作:

delegate void Callback(params object[] args); 

static void Method1(params string[] args) { } 

static Callback Wrap<T>(Action<T[]> action) 
{ 
    return (Callback)((object[] args) => action(args.Cast<T>().ToArray())); 
} 

static void Main(string[] args) 
{ 
    Callback callback1 = Wrap<string>(Method1); 
} 

这将铸就args的每个元素数组到指定的类型。当然,这要求包装方法具有一个数组作为其唯一参数,例如,一个params阵列。为了处理一些更喜欢你的具体的例子,你可以这样做:

static void Method2(string arg) { } 

static Callback Wrap<T>(Action<T> action) 
{ 
    return (Callback)((object[] args) => action((T)args[0])); 
} 

static void Main(string[] args) 
{ 
    Callback callback2 = Wrap<string>(Method2); 
} 

由于与.NET泛型委托类型ActionFunc,你就必须申报为每个参数数代表一个特定的包装方法。以上仅适用于一个参数。如果你有两个参数的例子,那么你需要添加:

static void Method3(string arg1, bool arg2) { } 

static Callback Wrap<T1, T2>(Action<T1, T2> action) 
{ 
    return (Callback)((object[] args) => action((T1)args[0], (T2)args[1])); 
} 

static void Main(string[] args) 
{ 
    Callback callback3 = Wrap<string, bool>(Method3); 
} 

等。写这些小封装是否真的值得,当然取决于你使用它们的多少。我会说在第三次或第四次回调之后,你可能会觉得它值得。

当然,我仍然认为用基于序列化的方法可能会更好。但这是一个不同的问题。 :)

+0

这是一个很好的解决方案。我只是采用一个无参数的无效返回方法,并依靠调用者调用该方法。有了这个,我可以在本地调用类似的方法,或者通过网络调用方法(这是委托给第三方Unity3D),无论如何它都会处理params object []。它(大概)使用反射。你的解决方案有点繁琐,但肯定更安全,更好,我可能会切换到这个。谢谢! – Ben 2014-12-02 07:22:45

相关问题