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

时间:2015-08-05 16:19:59

标签: c# unity3d unity5

我试图在List<dynamic>中存储方法列表以创建我的Quest系统的一部分。我从未使用过列表,但我并不完全知道dynamic关键字的作用,因此我无法理解。

首先,我创建了一个测试函数,并尝试将其存储在List<dynamic>中,然后输出Test函数通过控制台返回的内容({{1 }})。这是代码:

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; } } 下会出现一条红线,错误信息如下所示 -

  

&#34;编译动态表达式所需的一种或多种类型不能   找到。你错过了参考吗?&#34;

我如何使这项工作?

编辑:我也在寻找一种方法,通过参数为每个函数添加重载方法。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

Func<bool>表示不带参数并返回bool的委托。因此,制作一个List<Func<bool>>,您将获得一个不带参数的函数列表,并返回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代表没有返回值,这可能符合您真正想要的更好。其他一切工作完全一样。

答案 2 :(得分:0)

在方法名调用方法之后放置()个括号,它不会引用该方法。 因此,使用此逻辑:activeQuests.Add(Test());实际上正在调用Test()并查找返回值以传递到activeQuests。相反,您希望将{em>引用发送到Test()方法activeQuests,因此您必须在没有parenthesys的情况下传递它,即activeQuests.Add(Test);。但activeQuests需要是方法列表(Action<...>Func<...>),而不是dynamic列表。