如何在C#中调用List中的函数

Dra*_*ron 0 c# list unity-game-engine

我对C#很新,并试图找出如何从列表中调用函数.我认为List会完成我需要的工作.我可以将我的函数放入列表中,但我似乎无法实际调用它们.

首先我尝试了这个:

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");
    }
Run Code Online (Sandbox Code Playgroud)

然后这个

   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");
    }
Run Code Online (Sandbox Code Playgroud)

但都不起作用.我究竟做错了什么?这甚至可能吗?我想这样做的原因基本上就是我有100个函数,我希望我的程序在调用另一个函数时随机选择.

任何解决方案都值得赞赏,但请记住,我对C#和代码仍然很新.提前致谢.

Jam*_*aix 6

在C#/ .NET中,不同的方法签名具有代表它们的不同委托类型.Action表示不带参数且不返回任何值的函数,例如void Foo().如果要表示的函数采用float参数并且不返回任何内容,则需要使用Action<float>.具有返回值的函数用Func类型族(Func<T>,Func<T1, T2>...)表示.

你只能把一种代表放在一个List<T>,所以你不能混合Actions和Action<float>s.

要从C#中的列表中获取项目,请使用[n].喜欢

List<Action> actions = new List<Action>();
actions.Add(Foo);
Action a = actions[0];
Run Code Online (Sandbox Code Playgroud)

要在C#中调用委托实例,请Invoke在其上调用方法,或者只使用()哪个是调用的简写Invoke.对于Action,Invoke取0个参数,因为Action<T>它需要一个T参数,等等.

所以对于你的整个例子:

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");
}
Run Code Online (Sandbox Code Playgroud)