使用 List<> 在 C# Unity3D 中存储方法?

Using a List<> to store methods in C# Unity3D?

我正在尝试将方法列表存储在 List<dynamic> 中以创建我的 Quest 系统的一部分。我从来没有使用过列表,我也不完全知道 dynamic 关键字的作用,所以我在理解方面遇到了问题。

首先,我创建了一个测试函数,我试图将它存储在 List<dynamic> 中,然后通过控制台输出测试函数 returns 的内容 (Debug.Log()).这是代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Quests : MonoBehaviour
{
    public List<dynamic> activeQuests = new List<dynamic>();


    void Start()
    {
        activeQuests.Add(Test());
        Debug.Log(activeQuests[0]);
    }

    public bool Test()
    {
        return true;
    }
}

Debug.Log(activeQuests[0]);下方出现一条红线,报错信息如下 -

"One or more types required to compile a dynamic expression cannot be found. Are you missing a reference?"

如何进行这项工作?

编辑:我也在寻找一种方法来为每个带参数的函数添加重载方法。

如果方法总是参数较少我建议使用这个:

public List<System.Action> activeQuests = new List<System.Action>();

// usage
activeQuests.Add(Test)

可能需要 return 值。那么你应该和任何 Systen.Func<T ...> 代表一起去。

    public List<System.Func<bool>> activeQuests = new List<System.Func<bool>>();

    // usage
    activeQuests.Add(Test)

一种解决方案是不使用 dynamic。如果您可以使您的任务方法符合相同的签名,例如 bool Test(),那么您可以使用强类型来存储它。

Func<bool> 表示一个不带参数的委托,return 是一个 bool。因此,创建一个 List<Func<bool>> 并且您将拥有一个不带参数的函数列表和 return 一个 bool.

您犯的一个错误是 activeQuests.Add(Test());。这会调用 Test,然后将 return 值添加到 activeQuests,但您想要将 Test 本身添加到 activeQuests。去掉那些 () 这样你就不会调用函数了。

编辑:如果您想将参数传递给您的函数,请查看 Func<> 的其他版本。如果添加更多类型,则开始添加参数。例如,Func<int, bool> 是一个接受一个 int 参数的委托,return 是一个布尔值。

如果您的所有代表都在一个列表中,则为他们提供相同的签名是有意义的。这样你就可以用强类型调用它们中的任何一个。例如,您可以像这样调用 activeQuests 中的每个函数:

foreach (Func<int, bool> questFunction in activeQuests)
{
    questFunction(5);
}

同样,查看 ActionAction<...>。当您添加更多通用参数时,您就是在添加委托采用的参数。但是 Action 代表没有 return 值,这可能更符合您真正想要的。其他一切都完全一样。

在方法名后加上 () 圆括号 调用 方法,它不引用方法。 所以按照这个逻辑:activeQuests.Add(Test()); 实际上是在调用 Test() 并寻找 return 值传递给 activeQuests。相反,您想将 reference 发送到 Test() 方法到 activeQuests,因此您必须在不带括号的情况下传递它,即 activeQuests.Add(Test);。但是 activeQuests 需要是方法列表(Action<...>Func<...>),而不是 dynamic.

的列表