参数是否可用于调用具有强类型参数的方法

本文关键字:类型参数 方法 是否 用于 调用 参数 | 更新日期: 2023-09-27 18:32:49

我有一个根据网络状态调用委托的方法。该方法必须决定在何处调用该方法(服务器、客户端(。为了使其适用于任何方法,我定义了以下委托:

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

参数是否可用于调用具有强类型参数的方法

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

也就是说,虽然委托不允许你直接尝试执行的操作,但你可以创建一个通用方法来自动化大部分工作:

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

等等。当然,编写这些小包装器是否真的值得取决于您使用它们的量。我会说在第三次或第四次回调之后,您可能会发现这是值得的。

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

相关文章: