C# 在c语言中如何将方法存储在堆栈或列表中#

C# 在c语言中如何将方法存储在堆栈或列表中#,c#,list,methods,stack,C#,List,Methods,Stack,我的脚本中有多个方法可以在多维数组上执行转换,例如转置、移位、交换列……等等。我希望能够通过将这些方法存储在堆栈中并取其逆操作来撤消这些更改。 在列表中存储方法的好方法是什么? 到目前为止,我提出了两个建议 1-存储一堆字母,其中每个字母表示对方法的调用,例如t->transopse。 2-构建一个名为transformation的抽象类,并将我的所有方法作为子类,这样我的堆栈可以存储所有不同的方法您可以使用Func或操作将方法存储在列表中: List<Func<T1, T2, TR

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

您可以使用
Func
操作将方法存储在
列表中

List<Func<T1, T2, TReturn>>
或:


如果所有的方法都没有一个共同的签名,那么您有两个选择。您可以创建一个
对象的通用堆栈,并将它们全部推入其中,然后在弹出时,将签名与可能的签名进行比较,并相应地进行强制转换


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

shad0wk的答案的一个可能的改进,如果您想使用您的第一个想法,就是

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

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

它们都有一个共同的签名吗?然后你可以把它们放在一个列表中。方法有公共签名意味着什么?是返回值吗?@RaedTabani签名是所有参数类型的组合,返回类型;因此
intfoo(intx)
intbar(inty)
具有相同的签名,就像
T=int的
T Blah(T val)
一样,但是
void Blop(string s)
并不是所有方法都具有相同的签名。例如,swapColumn使用两个int参数,而transpose不使用,将未使用的值作为参数传递以获得相同的签名是一个好主意吗?但是如果我的函数没有返回类型(void),该怎么办?我可以改为使用Action吗?然后用
void
替换
TReturn
。私有堆栈操作=新堆栈();抛出一个错误“关键字void不能在此上下文中使用”好的,所以刚刚计算出
Func
必须有一个返回值,而
Action
将返回void,所以使用Action。很抱歉。如果我想将方法作为对象处理,我该如何调用它们?例如object temp=stack.pop()…@RaedTabani您可以检查它们(例如,使用
if(temp-typeof yourposiblefunctiontype)
并将它们转换为函数类型,然后正常调用它。问题是,如果有许多可能的类型,那么这将是低效的,第二段会更好。
List<Action<T1, T2>>
void MyFunction(T1 input1, T2 input2)
Dictionary<string, List<Func<T1, T2, TReturn>>>