程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了创建一个类似 Action.Invoke 的方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决创建一个类似 Action.Invoke 的方法?

开发过程中遇到创建一个类似 Action.Invoke 的方法的问题如何解决?下面主要结合日常开发的经验,给出你关于创建一个类似 Action.Invoke 的方法的解决方法建议,希望对你解决创建一个类似 Action.Invoke 的方法有所启发或帮助;

我正在尝试编写一个简单的方法来使代码更具可读性。我正在写一个有异步任务的部分,所以我使用 Action 作为我的方法的参数,以便在方法完成时获得回调。

总之我的签名总是这样:

public voID myAsyncmethod(...params...,Action<other params> onFinish = null)

我使用默认的 Action 作为 null 只是为了给库用户更多的灵活性,但在我的实现中,我总是要编写这段代码:

if (onFinish != null)
{
    UnitymainThreaddispatcher.Instance().Enqueue(
        () => onFinish(other params)
    );
}

是因为在 unity 中,我提供了在主线程上启动 Action 的可能性,以防用户需要与图形循环进行交互。 我的想法是:我可以将那段代码放在一个方法中以使方法实现更具可读性吗? 以这样的方式调用那个东西真的很棒:

onFinish?.InvokeOnMainThread(other params);

有点像Action?.Invoke方式。 所以我在 c# 中对扩展方法、操作和泛型做了一些搜索,但我无法掌握使用泛型构建方法来完成我想要达到的目标。 我真的不知道要搜索什么才能达到我的目标,我环顾四周,但可能我还不够好,无法将这些概念放在一起来达到我的目标。

到目前为止,我认为这样的事情(不起作用):

public static voID InvokeOnMainThread(this Action<T1,T2>,T1 t1,T2 t2){ ... }
public static voID InvokeOnMainThread<Action,T1,T2>(Action<T1,T2 t2){ ... }

我使用带有 2 个参数的 Action 只是因为在我的情况下是最常见的,但是我需要使用 0 到 4 个参数进行相同的调用(但我认为当我能够掌握这个概念时,它会很容易扩展或至少我可以复制它以获得我需要的参数数量)。

解决方法

您需要为 0-4 个可能的参数创建单独的扩展方法,如下所示:

public static partial class UnityExtensions
{
    public static void InvokeOnMainThread(this Action onFinish)
    {
        if (onFinish != null) // Or throw ArgumentNullException() if you prefer
            UnitymainThreadDispatcher.Instance().Enqueue(() => onFinish());
    }
    
    public static void InvokeOnMainThread<T1>(this Action<T1> onFinish,T1 t1)
    {
        if (onFinish != null)
            UnitymainThreadDispatcher.Instance().Enqueue(() => onFinish(t1));
    }
    
    public static void InvokeOnMainThread<T1,T2>(this Action<T1,T2> onFinish,T1 t1,T2 t2)
    {
        if (onFinish != null)
            UnitymainThreadDispatcher.Instance().Enqueue(() => onFinish(t1,t2));
    }
    
    public static void InvokeOnMainThread<T1,T2,T3>(this Action<T1,T3> onFinish,T2 t2,T3 t3)
    {
        if (onFinish != null)
            UnitymainThreadDispatcher.Instance().Enqueue(() => onFinish(t1,t2,t3));
    }
    
    public static void InvokeOnMainThread<T1,T3,T4>(this Action<T1,T4> onFinish,T3 t3,T4 t4)
    {
        if (onFinish != null)
            UnitymainThreadDispatcher.Instance().Enqueue(() => onFinish(t1,t3,t4));
    }
}

然后你就可以:

onFinish?.InvokeOnMainThread(param1,param2); // Or however many parameters you have.

Can I have a variable number of generic parameters? 中所述,c# 不允许可变数量的通用参数。这就是为什么例如每个支持的参数数量都有不同的 Tuple.Create<>() 方法。

大佬总结

以上是大佬教程为你收集整理的创建一个类似 Action.Invoke 的方法全部内容,希望文章能够帮你解决创建一个类似 Action.Invoke 的方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:的方法