使用 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);
}
同样,查看 Action
和 Action<...>
。当您添加更多通用参数时,您就是在添加委托采用的参数。但是 Action
代表没有 return 值,这可能更符合您真正想要的。其他一切都完全一样。
在方法名后加上 ()
圆括号 调用 方法,它不引用方法。
所以按照这个逻辑:activeQuests.Add(Test());
实际上是在调用 Test()
并寻找 return 值传递给 activeQuests
。相反,您想将 reference 发送到 Test()
方法到 activeQuests
,因此您必须在不带括号的情况下传递它,即 activeQuests.Add(Test);
。但是 activeQuests
需要是方法列表(Action<...>
或 Func<...>
),而不是 dynamic
.
的列表
我正在尝试将方法列表存储在 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);
}
同样,查看 Action
和 Action<...>
。当您添加更多通用参数时,您就是在添加委托采用的参数。但是 Action
代表没有 return 值,这可能更符合您真正想要的。其他一切都完全一样。
在方法名后加上 ()
圆括号 调用 方法,它不引用方法。
所以按照这个逻辑:activeQuests.Add(Test());
实际上是在调用 Test()
并寻找 return 值传递给 activeQuests
。相反,您想将 reference 发送到 Test()
方法到 activeQuests
,因此您必须在不带括号的情况下传递它,即 activeQuests.Add(Test);
。但是 activeQuests
需要是方法列表(Action<...>
或 Func<...>
),而不是 dynamic
.