【问题标题】:Array of function pointers in C#C#中的函数指针数组
【发布时间】:2009-11-30 09:05:29
【问题描述】:

有一组方法,例如:

  Foo(int, float, params objects[])
  Goo(int, params objects[])
  Too()

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

我从数据库中读取了一个整数(索引)。该整数对应上述方法之一(1 表示 Foo,2 表示 Goo,3 表示 Too)。

我如何将上述方法(作为委托)存储在一个集合中,以便我可以通过使用从 db 读取的整数作为索引对集合进行索引来调用适当的方法。

【问题讨论】:

    标签: c# indexing delegates collections


    【解决方案1】:

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

    【讨论】:

    • 您不需要在调用之前强制转换委托 - 只需使用 DynamicInvoke
    • @Dror Helper:您可以使用动态调用,但我个人宁愿通过演员立即找出类型错误。
    【解决方案2】:

    将方法作为Delegate 存储在列表或数组中,并使用DynamicInvoke 调用它们 - 请注意,您需要传递正确数量(和类型)的变量。

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

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

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

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

    【讨论】:

    • 非常好的解决方案,但ifs 仍然是不可避免的,因为您需要知道参数的数量。
    • True - 但我们可以使用不依赖于方法名称的反射编写代码。这取决于您要在这里完成什么。
    【解决方案3】:

    由于这三种方法具有不同数量的参数和类型以便调用它们,您需要知道您是哪种情况,所以ifs 是不可避免的。恕我直言,举行代表数组没有任何好处。

    switch (index) {
        case 1: // call method1
            break;
        case 2: // call method2
            break;
        case 3: // call method3
            break;
    }
    

    【讨论】:

    • 这如何回答上面的问题?
    【解决方案4】:

    我建议使用一个字典,其中键是索引,值是委托。但是,这些方法具有不同的签名,因此您将无法直接互换使用它们。顺便问一下,调用方法时,你会在哪里获取方法的参数?

    【讨论】:

    • 我目前有开关盒。但这看起来不太好。我将按照之前 2 篇文章中的建议尝试委托数组。顺便说一句,我从数据库中读取了参数。数据库包含方法 ID 及其参数。例如: InputCmd:显示新闻方法 ID:1 EventIdValid:EventId:StateIdValid:StateId:NumVarArgs:VarArgs1:VarArgs2:。 . . VarArgs10:根据输入命令,将调用具有关联参数的不同方法。
    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2023-04-04
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多