2

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

首先,我创建了一个测试函数,我试图将它存储在 中List<dynamic>,然后通过控制台 ( 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]);,错误信息如下图所示——

“找不到编译动态表达式所需的一种或多种类型。您是否缺少参考?”

我该如何进行这项工作?

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

4

3 回答 3

4

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

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

// usage
activeQuests.Add(Test)

也许需要一个返回值。那么你应该和任何Systen.Func<T ...>代表一起去。

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

    // usage
    activeQuests.Add(Test)
于 2015-08-05T16:23:09.167 回答
1

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

Func<bool>表示不带参数并返回 a 的委托bool。因此,制作 a List<Func<bool>>,您将获得一个不带参数并返回 a 的函数列表bool

你犯的一个错误是activeQuests.Add(Test());. 此调用Test然后将返回值添加到activeQuests,但您希望将Test自身添加到activeQuests。摆脱那些(),这样你就不会调用该函数。

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

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

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

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

于 2015-08-05T16:25:44.960 回答
0

()括号放在方法名称后调用该方法,它不引用该方法。所以有了这个逻辑:activeQuests.Add(Test());实际上是在调用Test()并寻找一个返回值来传递给activeQuests. 相反,您想将对该方法的引用发送到 中,因此您必须在不带括号的情况下传递它,即. 但需要是方法列表(或),而不是.Test()activeQuestsactiveQuests.Add(Test);activeQuestsAction<...>Func<...>dynamic

于 2015-08-05T17:06:17.343 回答