2016-07-22 13 views
3

私は多次元配列の変換を行うスクリプト内に、transpose、shift、swapColumn..etcなどの複数のメソッドを持っています。これらの変更を取り消したいそれらのメソッドをスタックに格納し、それらの逆を取ることによって実現される。 リストにメソッドを格納するにはどうすればよいでしょうか? これまでのところ、私は2つのappraochesを思いついた。 1文字のスタックを格納する。各文字は、メソッドの呼び出しを表す。例えば、t-> transopse。 2-変換と呼ばれる抽象クラスを構築し、私のスタックは、すべての異なる方法に一般的なスタックまたはリストにメソッドを格納する方法C#

+0

これらはすべて共通の署名を持っていますか? Listyに入れることができます TaW

+0

共通のシグネチャを持つメソッドはどういう意味ですか?それは戻り値ですか? –

+0

@RaedTabani署名は、すべてのパラメータ型と戻り値の型の組み合わせです。 'int Foo(int x)'と 'int Bar(int y)'は 'T = int'の' T Blah (T val) 'と同じシグネチャを持ちますが、' void Blop(string s) ' –

答えて

3

を保存することができるようにあなたがFuncActionを使用してListでメソッドを保存することができますサブクラスとしての私のすべてのメソッドを作る:

List<Func<T1, T2, TReturn>> 

TReturn MyFunction(T1 input1, T2 input2) 

または::

List<Action<T1, T2>> 
0に相当します等価である

:すべてのメソッドが共通の署名を持っていない場合

void MyFunction(T1 input1, T2 input2) 
+0

しかし、私の関数が型を返さなかった場合(void)? –

+0

代わりにActionを使用できますか? –

+0

そして、 'TReturn'を' void'に置き換えてください。 –

0

あなたはオプションのカップルを持っています。 objectの汎用スタックを作成し、そこにすべてをプッシュすると、ポップ時にシグネチャと可能なシグネチャを比較し、それに応じてキャストできます。

他の構造にメソッド全体をカプセル化し、そこにスタックを作成するか、リフレクションを使用してパラメータ型と戻り値の型を取得し、必要な値また、Listobjectの構造体に再度格納してキャストバックすることもできます)。リフレクションを使用する場合は、関数オブジェクト自体を格納する必要はなく、クラス名とメソッド名の文字列を使用するだけで済みません。

+0

メソッドをオブジェクトとして扱いたいのであれば、それらをどのように呼び出しますか?例えば、オブジェクトtemp = stack.pop()... –

+0

@RaedTabaniあなたはそれらをチェックすることができます(例えば、 'if(temp typeof yourPossibleFunctionType)'を使用して)それらを関数型にキャストし、それを普通に呼び出します。もちろん、可能な型が多くある場合は、これは非効率的で、2番目の段落が良いでしょう。 –

0

shad0wkの答えへの可能な改善は、あなたがあなたの第一のアイデアと一緒に行きたい場合には、多分

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

あなたが簡単にあなたの方法として、アクセスリストでその逆をペアにすることができ、そのようにすることです同じキー。

関連する問題