C#中的函数指针数组

Man*_*kar 2 c# indexing collections delegates

有一组方法,如:

  Foo(int, float, params objects[])
  Goo(int, params objects[])
  Too()
Run Code Online (Sandbox Code Playgroud)

每个参数都采用不同数量的&参数类型(返回值也是如此).

我从数据库中读取一个整数(索引).整数对应于上述方法之一(对于Foo为1,对于Goo为2,对于Too为3).

如何在集合中存储上述方法(作为委托),以便通过使用从db读取的整数作为索引索引到集合中来调用适当的方法.

Jon*_*eet 8

您可以使用Delegate[]- 当您读取整数时,您需要将相关的数组值转换为a Action<int, float, object[]>,a Action<int, object[]>Action之前调用它.

  • @Dror Helper:你*可以*使用动态调用,但我个人更愿意通过强制转换立即找出类型错误*. (3认同)

Dro*_*per 6

将方法存储在DelegateList或Array中并用于DynamicInvoke调用它们 - 请注意,您需要传递正确的数字(和类型)变量.

var delegates = new List<Delegate>();
delegates.Add((Action<int, float, object[]>)Foo);
//...
delegates[0].DynamicInvoke(new[] {0, 1.2, new object()});
Run Code Online (Sandbox Code Playgroud)

当您想要将默认值(读取:零/空)传递给方法时,此解决方案最适合 - 然后您可以使用反射来创建默认值.

另一个有用的情况是,如果要调用特定的方法签名(即接收单个int的方法),那么您可以转到所需的索引并检查(使用反射)是否可以使用该参数调用委托.

否则,您需要了解所调用的方法,因为每种方法都有不同的参数类型和编号.