【问题标题】:How to store Methods in a stack or a list in general c#c#中如何将方法存储在堆栈或列表中
【发布时间】:2016-11-25 23:25:42
【问题描述】:

我的脚本中有多个方法可以对多维数组执行转换,例如转置、移位、swapColumn..etc 我希望能够通过将方法存储在堆栈中并取其逆来撤消这些更改。 将方法存储在列表中的好方法是什么? 到目前为止,我想出了两个方法 1-存储一堆字母,其中每个字母代表对方法的调用,例如 t->transopse。 2-构建一个名为transformation的抽象类并将我所有的方法作为子类,以便我的堆栈可以存储所有不同的方法

【问题讨论】:

  • 他们都有一个共同的签名吗?然后你可以把它们放在 Listy
  • 方法具有共同签名意味着什么?是返回值吗?
  • @RaedTabani 的签名是所有参数类型的组合,以及返回类型;所以int Foo(int x)int Bar(int y) 具有相同的签名,T Blah<T>(T val)T=int 具有相同的签名,但void Blop(string s) 没有
  • 不,并非所有方法都具有相同的签名。例如 swapColumn 采用两个 int 参数,而 transpose 不采用,将未使用的值作为参数传递以具有相同的签名是一个好主意吗?

标签: c# list methods stack


【解决方案1】:

您可以使用FuncAction 将方法存储在List 中:

List<Func<T1, T2, TReturn>>

相当于:

TReturn MyFunction(T1 input1, T2 input2)

或者:

List<Action<T1, T2>>

相当于:

void MyFunction(T1 input1, T2 input2)

【讨论】:

  • 但是如果我的函数没有返回类型(void)怎么办?
  • 我可以用 Action 代替吗?
  • 然后将TReturn替换为void
  • 私有堆栈> actions = new Stack>();给我一个错误“关键字 void 不能在这种情况下使用”
  • 好的,所以刚刚计算出Func 必须有一个返回值,而Action 将返回无效,所以使用操作。对此感到抱歉。
【解决方案2】:

如果您想采用您的第一个想法,可能对 shad0wk 的回答进行改进,可能会有

Dictionary<string, List<Func<T1, T2, TReturn>>>

这样您就可以轻松地将您的方法和它们的逆方法配对到一个使用相同键访问的列表中。

【讨论】:

    【解决方案3】:

    如果所有方法都没有共同的签名,你有几个选择。您可以制作一个通用的 objects 堆栈并将它们全部推入其中,然后当您弹出时,将签名与可能的签名进行比较并进行相应的转换。

    设计方面更好的方法可能是将整个方法封装在另一个结构中并在那里制作堆栈,或者使用反射来获取它的参数类型和返回类型并用你需要的任何值填充它(你也可以存储在结构中,可能会再次使用objects 的List 并回退)。如果您使用反射,您甚至可能不需要存储函数对象本身,而只需使用类和方法名称的字符串。

    【讨论】:

    • 如果我想将方法​​视为对象,我该如何调用它们?例如 object temp = stack.pop() ...
    • @RaedTabani 你可以检查它们(例如使用if (temp typeof yourPossibleFunctionType) 并将它们转换为函数类型,然后正常调用它。当然,如果有很多可能的类型,那么这将效率低下,第二段会更好。
    猜你喜欢
    • 2021-01-19
    • 2015-03-13
    • 2013-12-06
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    相关资源
    最近更新 更多