C# 如何在C中调用列表中的函数#
我对C#相当陌生,正在尝试找出如何从列表中调用函数。我以为那张单子能完成我需要的工作。我可以将我的函数放入列表中,但我似乎无法实际调用它们 首先,我尝试了这个:C# 如何在C中调用列表中的函数#,c#,list,unity3d,C#,List,Unity3d,我对C#相当陌生,正在尝试找出如何从列表中调用函数。我以为那张单子能完成我需要的工作。我可以将我的函数放入列表中,但我似乎无法实际调用它们 首先,我尝试了这个: List<Action> randEvent = new List<Action>(); void Test() { randEvent.Add(Test2); Invoke(randEvent(0), 0f); } void Test2()
List<Action> randEvent = new List<Action>();
void Test()
{
randEvent.Add(Test2);
Invoke(randEvent(0), 0f);
}
void Test2()
{
print("This is a test of the random event system");
}
List randEvent=new List();
无效测试()
{
randEvent.Add(Test2);
调用(随机事件(0),0f);
}
void Test2()
{
打印(“这是对随机事件系统的测试”);
}
那么这个
List<Action> randEvent = new List<Action>();
void Test()
{
randEvent.Add(Test2);
randEvent(0);
}
void Test2()
{
print("This is a test of the random event system");
}
List randEvent=new List();
无效测试()
{
randEvent.Add(Test2);
随机事件(0);
}
void Test2()
{
打印(“这是对随机事件系统的测试”);
}
但两者都不起作用。我做错了什么?这可能吗?我之所以想这样做,基本上是因为我有100个函数,我希望我的程序在调用另一个函数时随机选择它们
任何解决方案都值得赞赏,但请记住,我对C#和代码还是很陌生。提前感谢。您可以声明一个
操作的列表,每个对象将指向一个特定的方法。榜样
IList<Action> actionList = new List<Action>();
actionList.Add(() => Test2());
我假设randEvent
是一个列表
或列表
使用Delegate.Invoke(args)
(因为EventHandler
和Action
都是Delegate
子类型)
在C#中,您也可以直接对委托使用()
:
randEvent[0]( 123 );
在C#/.NET中,不同的方法签名具有不同的代表它们的委托类型<代码>操作
表示不带参数且不返回值的函数,如void Foo()
。如果要表示的函数采用float
参数且不返回任何内容,则需要使用Action
。具有返回值的函数用Func
类型族(Func
,Func
…)表示
您只能将一种委托放入列表
,因此不能将操作
s和操作
s混合使用
要从C#中的列表中获取项目,请使用[n]
。像
List<Action> actions = new List<Action>();
actions.Add(Foo);
Action a = actions[0];
如何定义randEvent
?请阅读并记下抱歉,我的副本中遗漏了那一行,谢谢你指出。正如问题描述所说,“但两者都不起作用”真的很糟糕。编译器/运行时/调试器都提供了非常有用的信息(错误消息、堆栈跟踪等)来说明“不工作”的性质,您应该在提出问题时提供这些信息。不这样做可能会被视为懒惰。我认为这没有必要,甚至没有帮助,因为“不起作用”纯粹是滥用语法。这些错误对阅读此问题的任何人都没有用处。@Rathlord肯定会的。例如,您将得到一个指示,指出错误在您提供的几百个字符的代码中的位置。对于试图帮助你的人来说,这是有用的信息。更重要的是,通过花时间陈述所有事实,你可能会深入了解自己的问题。编写SO问题是一种形式的“”。您不需要执行Add(()=>Test2())
,只需执行Add(Test2)
。lambda只是添加了一层无用的索引和闭包的性能开销。我希望随机调用它们,这就是我这样做的原因。所以我需要一种方法,根据我输入的随机数字,一次一个地给他们打电话。不希望一次完成,也不希望按顺序完成。不过,感谢您的回复。@Rathlord一旦生成了索引,就可以在列表中传递该值以获得该方法<代码>操作列表[3]。调用()代码>假设3是一个随机数感谢所有的帮助-找到了一个更简单的解决方案(至少是让我的头脑清醒一下),但我真的很感谢时间。这正是我需要的,我所要做的就是将行更改为:randEvent[0]();非常感谢!
randEvent[0]( 123 );
List<Action> actions = new List<Action>();
actions.Add(Foo);
Action a = actions[0];
List<Action> actions = new List<Action>();
void Test()
{
actions.Add(PrintStuff);
actions[0]();
//or
actions[0].Invoke();
//or
foreach (var a in actions) a();
}
void PrintStuff()
{
print("This is a test of the random event system");
}