Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中调用列表中的函数#_C#_List_Unity3d - Fatal编程技术网

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()

我对C#相当陌生,正在尝试找出如何从列表中调用函数。我以为那张单子能完成我需要的工作。我可以将我的函数放入列表中,但我似乎无法实际调用它们

首先,我尝试了这个:

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");
}