我试图在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;
我如何使这项工作?
编辑:我也在寻找一种方法,通过参数为每个函数添加重载方法。
答案 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);
}
同样,请查看Action
和Action<...>
。添加更多通用参数时,您需要添加委托所需的参数。但是Action
代表没有返回值,这可能符合您真正想要的更好。其他一切工作完全一样。
答案 2 :(得分:0)
在方法名调用方法之后放置()
个括号,它不会引用该方法。
因此,使用此逻辑:activeQuests.Add(Test());
实际上正在调用Test()
并查找返回值以传递到activeQuests
。相反,您希望将{em>引用发送到Test()
方法activeQuests
,因此您必须在没有parenthesys的情况下传递它,即activeQuests.Add(Test);
。但activeQuests
需要是方法列表(Action<...>
或Func<...>
),而不是dynamic
列表。