大佬教程收集整理的这篇文章主要介绍了创建一个类似 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,请注明来意。